🤞 Sync 2026-06-25 00:16:31

This commit is contained in:
github-actions[bot] 2026-06-25 00:16:31 +08:00
parent 7e9cb31284
commit 7250d97e2b
14 changed files with 505 additions and 276 deletions

View File

@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-daede
PKG_VERSION:=1.14.7
PKG_RELEASE:=22
PKG_RELEASE:=23
PKG_MAINTAINER:=kenzok8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

View File

@ -452,7 +452,13 @@ return view.extend({
uci.set('daede', 'config', 'geo_auto_freq', freqSel.value);
const orig = saveBtn.textContent;
saveBtn.disabled = true; saveBtn.textContent = '...';
uci.save().then(function() { return uci.apply(); }).then(function() {
uci.save().then(function() {
return uci.changes();
}).then(function(changes) {
// apply only when changed; empty changeset fails apply (#16)
if (changes && Object.keys(changes).length)
return uci.apply();
}).then(function() {
return fs.exec('/usr/share/luci-app-daede/geo-cron.sh', [autoCb.checked ? 'enable' : 'disable']);
}).then(function() {
logPane.textContent = _('Geo data source saved.');

View File

@ -10,8 +10,8 @@ LUCI_TITLE:=Simple OTA Update for OpenWrt
#LUCI_DEPENDS:= +luci-app-firewall
PKG_LICENSE:=Apache-2.0
PKG_VERSION:=0.0.2
PKG_RELEASE:=2
PKG_VERSION:=0.0.3
PKG_RELEASE:=3
include $(TOPDIR)/feeds/luci/luci.mk

View File

@ -9,32 +9,48 @@
*/
return view.extend({
load: function() {
return Promise.resolve();
// Format raw firmware filename → "OpenWrt 24.10.7 202606-rev01"
fmtVer: function(raw) {
if (!raw) return '';
// From openwrt-24.10.7-4g-lte-202606-rev01
var m = raw.match(/^openwrt-([\d.]+)-.*-(\d{6}-rev\d+)$/);
if (m) return 'OpenWrt ' + m[1] + ' ' + m[2];
return raw;
},
checkInitialState: function() {
load: function() {
return fs.read('/usr/lib/os-release')
.then(function(content) {
// OPENWRT_RELEASE="OpenWrt 24.10.7~4g-lte-202606-rev01"
var m = (content || '').match(/OPENWRT_RELEASE="(OpenWrt\s+[\d.]+)~.*-(\d{6}-rev\d+)"/);
if (m) return m[1].trim() + ' ' + m[2].trim();
return '';
})
.catch(function() { return ''; });
},
checkInitialState: function(currentVer) {
var self = this;
this.verifyCheckResult().then(function(success) {
// Show current version immediately from fw_rev
self.updateVersionBlock(currentVer, '—', false);
// Restore available version if previous check result still on disk
self.verifyCheckResult(currentVer).then(function(success) {
if (success) {
self.checkButton.disabled = true;
self.showUpdateAvailable();
self.upgradeButton.disabled = false;
}
}).catch(function() {});
},
showUpdateAvailable: function() {
var self = this;
self.statusDiv.innerHTML = '';
self.statusDiv.appendChild(E('div', { 'class': 'alert-message success' }, [
E('h3', {}, _('Update Available')),
E('button', {
'class': 'btn cbi-button cbi-button-neutral',
'style': 'margin-top: 6px;',
'click': function() { self.showChangelog(); }
}, _('Show Changelog'))
]));
updateVersionBlock: function(current, upgrade, hasUpdate) {
this.verCurrentVal.textContent = current || '—';
this.verAvailVal.textContent = upgrade || '—';
// Changelog link visible only when update is available
this.verChangelogLink.style.display = hasUpdate ? '' : 'none';
// Colour: important (green) = update found, warning (yellow) = no update / unknown
this.versionBlock.className = 'alert-message ' + (hasUpdate ? 'success' : 'warning');
},
showChangelog: function() {
@ -52,7 +68,7 @@ return view.extend({
]);
},
render: function() {
render: function(data) {
var self = this;
this.checkButton = E('button', {
@ -66,7 +82,29 @@ return view.extend({
'click': ui.createHandlerFn(this, 'handleUpgrade')
}, _('Upgrade'));
this.statusDiv = E('div', { 'class': 'cbi-section' });
// Version info rows — always visible, updated after check
this.verCurrentVal = E('span', {}, '—');
this.verAvailVal = E('span', {}, '—');
this.verChangelogLink = E('button', {
'class': 'btn cbi-button cbi-button-neutral',
'style': 'display: none; margin-left: 10px;',
'click': function() { self.showChangelog(); }
}, _('Show Changelog'));
this.versionBlock = E('div', { 'class': 'alert-message', 'style': 'margin-top: 1.5em;' }, [
E('table', { 'style': 'border: none; background: none;' }, [
E('tr', {}, [
E('td', { 'style': 'padding: 2px 10px 2px 0; font-weight: bold; white-space: nowrap;' },
_('Current version:')),
E('td', {}, this.verCurrentVal)
]),
E('tr', {}, [
E('td', { 'style': 'padding: 2px 10px 2px 0; font-weight: bold; white-space: nowrap;' },
_('Available version:')),
E('td', {}, [ this.verAvailVal, this.verChangelogLink ])
])
])
]);
var container = E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('OTA System Update')),
@ -75,10 +113,10 @@ return view.extend({
' ',
this.upgradeButton
]),
this.statusDiv
this.versionBlock
]);
this.checkInitialState();
this.checkInitialState(data);
return container;
},
@ -87,33 +125,23 @@ return view.extend({
var self = this;
this.checkButton.disabled = true;
this.statusDiv.innerHTML = '';
this.statusDiv.appendChild(E('div', { 'class': 'spinner' }, _('Checking for updates...')));
this.upgradeButton.disabled = true;
return fs.exec('/usr/share/ota.sh', ['check'])
.then(function() {
return self.verifyCheckResult();
return self.verifyCheckResult(self.verCurrentVal.textContent);
})
.then(function(success) {
if (success) {
self.upgradeButton.disabled = false;
self.showUpdateAvailable();
} else {
self.statusDiv.innerHTML = '';
self.statusDiv.appendChild(E('div', { 'class': 'alert-message warning' },
_('No updates available or check failed')));
}
self.upgradeButton.disabled = !success;
self.checkButton.disabled = false;
})
.catch(function(err) {
self.statusDiv.innerHTML = '';
self.statusDiv.appendChild(E('div', { 'class': 'alert-message error' },
_('Check failed: ') + (err.message || err)));
self.updateVersionBlock('', _('Check failed: ') + (err.message || err), false);
self.checkButton.disabled = false;
});
},
verifyCheckResult: function() {
verifyCheckResult: function(currentVer) {
var self = this;
return Promise.all([
@ -124,11 +152,33 @@ return view.extend({
self.changelog = content;
return content && content.length > 0;
})
.catch(function() { return false; })
.catch(function() { return false; }),
fs.read('/tmp/ota_version')
.then(function(content) { return content || ''; })
.catch(function() { return ''; })
]).then(function(results) {
return results[0] !== null &&
results[1] !== null &&
results[2] === true;
var hasProfiles = results[0] !== null;
var hasLock = results[1] !== null;
var hasChangelog = results[2];
var verContent = results[3];
// both current= and upgrade= are full firmware names written by ota.sh
var current = '', upgrade = '';
verContent.split('\n').forEach(function(line) {
var m;
if ((m = line.match(/^current=(.+)/))) current = self.fmtVer(m[1].trim());
if ((m = line.match(/^upgrade=(.+)/))) upgrade = self.fmtVer(m[1].trim());
});
// fallback: if ota_version missing, use value from load() (already formatted)
if (!current) current = currentVer || '';
if (hasProfiles && hasLock && hasChangelog) {
self.updateVersionBlock(current, upgrade, true);
return true;
}
self.updateVersionBlock(current, _('No updates available'), false);
return false;
});
},
@ -142,53 +192,46 @@ return view.extend({
this.upgradeButton.disabled = true;
this.checkButton.disabled = true;
// Remove stale progress file before starting
fs.remove('/tmp/ota_progress').catch(function() {});
self.openUpgradeModal();
return fs.exec('/usr/share/ota.sh', ['upgrade'])
// ota-launch.sh starts ota.sh in background and exits immediately
return fs.exec('/usr/share/ota-launch.sh', [])
.then(function() {
self.stopProgressPolling();
self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done');
self.finalizeUpgradeModal(false);
// launcher exited — polling is running, wait for 'done' or 'error'
})
.catch(function(err) {
var msg = err.message || err.toString();
self.stopProgressPolling();
// XHR timeout = sysupgrade already running, treat as success
if (msg.indexOf('timed out') !== -1) {
self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done');
self.finalizeUpgradeModal(false);
} else {
self.setModalProgress(0, _('Error: ') + msg, 'error');
self.finalizeUpgradeModal(true);
// XHR timeout is expected — launcher or sysupgrade still running,
// polling continues and will finalize via 'flashing'/'error' state
if (msg.indexOf('timed out') !== -1 || msg.indexOf('XHR') !== -1) {
return;
}
// Genuine exec failure
self.stopProgressPolling();
self.setModalProgress(0, _('Launch failed: ') + msg, 'error');
self.finalizeUpgradeModal(true);
});
},
openUpgradeModal: function() {
var self = this;
// Progress bar element
self.modalProgressInner = E('div', { 'style': 'width: 0%; transition: width 0.4s ease;' });
self.modalProgressBar = E('div', { 'class': 'cbi-progressbar', 'style': 'margin: 10px 0;' },
self.modalProgressInner);
self.modalProgressBar = E('div', {
'class': 'cbi-progressbar',
'style': 'margin: 10px 0;'
}, self.modalProgressInner);
// Status label
self.modalStatus = E('div', {
'style': 'font-size: 0.9em; color: #666; margin-bottom: 8px;'
}, _('Starting upgrade...'));
// Log area
self.modalLog = E('pre', {
'style': 'white-space: pre-wrap; max-height: 200px; overflow-y: auto; ' +
'background: #f5f5f5; padding: 8px; border-radius: 3px; ' +
'color: black; font-size: 0.85em; margin-top: 10px;'
}, '');
// Close button (disabled until done)
self.modalCloseBtn = E('button', {
'class': 'btn cbi-button',
'disabled': true,
@ -209,7 +252,6 @@ return view.extend({
])
]);
// Start polling /tmp/ota_progress
self.startProgressPolling();
},
@ -227,7 +269,6 @@ return view.extend({
if (line.indexOf('downloading') === 0) {
var pct = parseInt(line.split(' ')[1], 10) || 0;
// downloading maps to 0..70% of bar
var barPct = Math.round(pct * 0.70);
self.setModalProgress(barPct,
_('Downloading firmware: ') + pct + '%', 'progress');
@ -242,18 +283,37 @@ return view.extend({
self.appendModalLog(_('Testing firmware image...'));
} else if (line === 'flashing') {
self.stopProgressPolling();
self.setModalProgress(95, _('Flashing! DO NOT POWER OFF!'), 'progress');
self.appendModalLog(_('Flashing firmware...'));
// Simulate reboot wait with countdown
var countdown = 90;
self.setModalProgress(98, _('Device will be rebooted, please wait... ') + countdown + 's', 'progress');
var rebootTimer = setInterval(function() {
countdown--;
if (countdown <= 0) {
clearInterval(rebootTimer);
self.setModalProgress(100, _('Device will be rebooted, please wait... '), 'done');
self.finalizeUpgradeModal(false);
} else {
self.setModalProgress(98, _('Device will be rebooted, please wait... ') + countdown + 's', 'progress');
}
}, 1000);
} else if (line === 'done') {
self.stopProgressPolling();
self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done');
self.appendModalLog(_('Done. Waiting for reboot...'));
self.finalizeUpgradeModal(false);
} else if (line.indexOf('error') === 0) {
var reason = line.replace('error', '').trim();
self.stopProgressPolling();
self.setModalProgress(0, _('Error: ') + reason, 'error');
self.appendModalLog(_('FAILED: ') + reason);
self.stopProgressPolling();
self.finalizeUpgradeModal(true);
}
}).catch(function() {
// file not yet created — ignore
});
}).catch(function() {});
}, 1500);
},
@ -269,7 +329,6 @@ return view.extend({
var pct = Math.min(100, Math.max(0, percent));
this.modalProgressInner.style.width = pct + '%';
this.modalStatus.textContent = text;
if (state === 'error') {
this.modalStatus.style.color = '#c00';
} else if (state === 'done') {
@ -282,7 +341,6 @@ return view.extend({
appendModalLog: function(line) {
if (!this.modalLog) return;
this.modalLog.textContent += line + '\n';
// Auto-scroll to bottom
this.modalLog.scrollTop = this.modalLog.scrollHeight;
},
@ -291,11 +349,9 @@ return view.extend({
this.modalCloseBtn.disabled = false;
}
if (!isError) {
// For successful flash — don't re-enable buttons,
// device is about to reboot
this.statusDiv.innerHTML = '';
this.statusDiv.appendChild(E('div', { 'class': 'alert-message warning' },
_('Upgrade started! DO NOT POWER OFF THIS DEVICE! System will reboot after upgrade.')));
this.versionBlock.className = 'alert-message warning';
this.verAvailVal.textContent = _('Upgrade started — device will reboot');
this.verChangelogLink.style.display = 'none';
} else {
this.upgradeButton.disabled = false;
this.checkButton.disabled = false;

View File

@ -3,35 +3,60 @@
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Konstantine Shevlakov <shevlakov@132lan.ru>\n"
msgid "OTA Update"
msgstr "Обновление OTA"
msgid "Update Available"
msgstr "Доступно обновление"
msgid "OTA System Update"
msgstr "Обновление через OTA"
msgid "Changelog"
msgstr "Изменения"
msgid "Check for Updates"
msgstr "Проверить"
msgid "Upgrade"
msgstr "Обновить"
msgid "Checking for updates..."
msgstr "Проверка обновлений..."
msgid "Show Changelog"
msgstr "Посмотреть изменения"
msgid "No updates available or check failed"
msgstr "Нет доступных обновлений"
msgid "Current version:"
msgstr "Текущая версия:"
msgid "Available version:"
msgid "Доступно обновление:"
msgid "OTA System Update"
msgstr "Обновление через OTA"
msgid "OTA Update"
msgstr "Обновление OTA"
msgid "Check failed: "
msgstr "Неудачно: "
msgid "Download completed successfully! Start upgrade.<br />DO NOT POWER OFF THIS DEVICE!<br />System will be upgrade completed after reboot!"
msgstr "Загрузка обновления завершена. Запущен процесс обновления.<br />НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!<br />Система будет обновлена после перезагрузки!"
msgid "No updates available"
msgstr "Нет доступных обновлений"
msgid "Upgrade failed: "
msgstr "Обновление прервано: "
msgid "Downloading: "
msgstr "Загружается: "
msgid "Download completed! Prepare upgrade..."
msgstr "Загрузка выполнена. Подготовка..."
msgid "Verifying SHA256 checksum..."
msgstr Проверка суммы SHA256..."
msgid "Verifying SHA256..."
msgstr "Проверка SHA256..."
msgid "Testing firmware image (sysupgrade -T)..."
msgstr "Проверка образа прошивки (sysupgrade -T)..."
msgid "Testing firmware image..."
msgstr "Проверка образа прошивки..."
msgid "Flashing! DO NOT POWER OFF!"
msgstr "Прошивка! НЕ ОТКЛЮЧАЙТЕ ПИТАНИЕ УСТРОЙСТВА!"
msgid "Flashing firmware..."
msgstr "Запись прошивки..."
msgid "Device will be rebooted, please wait... "
msgstr "Устройство будет перезагружено, ожидание..."
msgid "Upgrade started — device will reboot"
msgstr "Обновление, устройство будет перезагружено"

View File

@ -0,0 +1,8 @@
#!/bin/sh
# OTA upgrade background launcher
# Called by LuCI to start upgrade asynchronously.
# Returns immediately so the RPC call completes and JS polling can work.
rm -f /tmp/ota_progress
setsid /usr/share/ota.sh upgrade > /tmp/ota_upgrade.log 2>&1 &
echo $! > /tmp/ota_upgrade.pid

View File

@ -34,6 +34,7 @@
. /lib/functions.sh
PROGRESS_FILE=/tmp/ota_progress
VERSION_FILE=/tmp/ota_version
set_progress() {
echo "$1" > ${PROGRESS_FILE}
@ -142,32 +143,27 @@ for b in $BASE_BOARD; do
echo "from $URL_BASE"
set_progress "downloading 0"
# Start wget in background
wget ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE -O /tmp/firmware.bin 2>/dev/null &
WGET_PID=$!
# Poll file size while wget runs
while kill -0 $WGET_PID 2>/dev/null; do
CURRENT=$(stat -c%s /tmp/firmware.bin 2>/dev/null || echo 0)
if [ -n "$FILESIZE" ] && [ "$FILESIZE" -gt 0 ]; then
PCT=$(( CURRENT * 100 / FILESIZE ))
[ $PCT -gt 99 ] && PCT=99
set_progress "downloading $PCT"
fi
sleep 1
# Download with uclient-fetch, parse % from stderr progress bar
uclient-fetch -O /tmp/firmware.bin ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE 2>&1 | while IFS= read -r line; do
pct=$(echo "$line" | grep -o '[0-9]*%' | tr -d '%' | tail -1)
[ -n "$pct" ] && set_progress "downloading $pct"
done
wait $WGET_PID
# Bash, not ash
#DL_RC=${PIPESTATUS[0]:-$?}
DL_RC=$?
# ash-safe fallback: check file exists and non-empty
[ -s /tmp/firmware.bin ] && DL_RC=0
sleep 2
case $DL_RC in
0) echo "Download complete."
set_progress "downloading 100" ;;
*) echo "No updates for this board: $BOARD"
*) echo "Download failed for board: $BOARD"
set_progress "error download"
remove_files && exit 0 ;;
remove_files && exit 1 ;;
esac
sleep 2
set_progress "verifying"
SHA256_DL=$(sha256sum /tmp/firmware.bin | awk '{print $1}')
echo -n "Check sha256 sum: "
@ -176,25 +172,31 @@ for b in $BASE_BOARD; do
echo "Update process start!"
echo "Device will be rebooted."
echo "DO NOT TURN OFF DEVICE!"
sleep 2
set_progress "testing"
sysupgrade -T /tmp/firmware.bin
case $? in
0) echo "Flashing firmware"
set_progress "flashing" ;;
0) echo "Flashing firmware" ;;
*) echo "Failed! Abort update"
set_progress "error verify"
remove_files && exit 0 ;;
remove_files && exit 1 ;;
esac
sleep 2
set_progress "flashing"
rm -rf /tmp/update.lock /tmp/profiles.json /tmp/changelog.txt
sleep 25 && sysupgrade /tmp/firmware.bin &
# Exit cleanly before sysupgrade takes over
sleep 30 && sysupgrade /tmp/firmware.bin &
exit 0
else
echo "Failed! Abort update."
set_progress "error sha256"
remove_files && rm -rf /tmp/update.lock /tmp/profiles.json
exit 1
fi
fi
;;
check)
. /usr/lib/os-release
if [ $FW_REV_EXT -gt $FW_VER_LOCAL ]; then
echo "New firmware upgrade release!"
echo -e "*** $FILE ***\n"
@ -205,8 +207,16 @@ for b in $BASE_BOARD; do
echo ""
echo "Please run script again for download and install update!"
touch /tmp/update.lock
# Write version info for LuCI
# Extract prefix (everything before YYYYMM date) from remote filename
VER_PREFIX=$(echo $FILE | sed 's/-[0-9]\{6\}-rev[0-9]*-.*//')
VER_UPGRADE="${VER_PREFIX}-$(echo $FILE | sed 's/.*-\([0-9]\{6\}-rev[0-9]*\)-.*/\1/')"
VER_CURRENT="${VER_PREFIX}-${FW_REV}"
printf "current=%s\nupgrade=%s\n" "$VER_CURRENT" "$VER_UPGRADE" > ${VERSION_FILE}
else
echo "Update not found!"
# Write only current version using OPENWRT_RELEASE prefix + local FW_REV
printf "current=%s\nupgrade=\n" "${OPENWRT_RELEASE%~*} $FW_REV" > ${VERSION_FILE}
fi
;;
esac

View File

@ -4,14 +4,20 @@
"read": {
"file": {
"/usr/share/ota.sh": ["exec"],
"/usr/share/ota-launch.sh": ["exec"],
"/usr/lib/os-release": ["read"],
"/rom/etc/uci-defaults/fw_rev": ["read"],
"/tmp/changelog.txt": ["read"],
"/tmp/profiles.json": ["read"],
"/tmp/update.lock": ["read"]
"/tmp/update.lock": ["read"],
"/tmp/ota_version": ["read"],
"/tmp/ota_progress": ["read"]
}
},
"write": {
"file": {
"/usr/share/ota.sh": ["exec"]
"/usr/share/ota.sh": ["exec"],
"/usr/share/ota-launch.sh": ["exec"]
}
}
}

View File

@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=195
PKG_RELEASE:=30
PKG_RELEASE:=31
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \

View File

@ -68,6 +68,26 @@ end
table.sort(key_table)
-- 获取 Xray 版本号
if is_finded("xray") then
local version = luci.sys.exec("xray version 2>&1")
if version and version ~= "" then
xray_version = version:match("Xray%s+([%d%.]+)")
end
end
-- 将 Xray 版本号转换为数字
if xray_version and xray_version ~= "" then
local major, minor, patch =
xray_version:match("(%d+)%.?(%d*)%.?(%d*)")
major = tonumber(major) or 0
minor = tonumber(minor) or 0
patch = tonumber(patch) or 0
xray_version_val = major * 10000 + minor * 100 + patch
end
m = Map("shadowsocksr")
-- [[ global ]]--
s = m:section(TypedSection, "global", translate("Server failsafe auto swith and custom update settings"))
@ -237,15 +257,31 @@ if is_finded("xray") then
o:value("1-5", "1-5")
o:depends("fragment", true)
o = s:option(Value, "fragment_length", translate("Fragment Length"), translate("Fragmented packet length (byte)"))
o.datatype = "or(uinteger,portrange)"
o = s:option(Value, "fragment_length", translate("Fragment Length"))
if xray_version_val <= 260601 then
o.datatype = "or(uinteger,portrange)"
end
o.default = "100-200"
o:depends("fragment", true)
o.description = translate(
"<ul>" ..
"<li>" .. translate("Fragmented packet length (byte)") .. "</li>" ..
"<li>" .. translate("Note: When version is higher than 26.6.1, input multiple fragment lengths saperate with ','.") .. "</li>" ..
"</ul>"
)
o = s:option(Value, "fragment_delay", translate("Fragment Delay"), translate("Fragmentation interval (ms)"))
o.datatype = "or(uinteger,portrange)"
o = s:option(Value, "fragment_delay", translate("Fragment Delay"))
if xray_version_val <= 260601 then
o.datatype = "or(uinteger,portrange)"
end
o.default = "10-20"
o:depends("fragment", true)
o.description = translate(
"<ul>" ..
"<li>" .. translate("Fragmentation interval (ms)") .. "</li>" ..
"<li>" .. translate("Note: When version is higher than 26.6.1, input multiple fragment intervals saperate with ','.") .. "</li>" ..
"</ul>"
)
o = s:option(Value, "fragment_maxSplit", translate("Max Split"), translate("Limit the maximum number of splits."))
o.datatype = "or(uinteger,portrange)"

View File

@ -1,7 +1,7 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251
msgid ""
"\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 "
"data writes by the client. \"tlshello\" is for TLS client hello packet "
@ -64,7 +64,7 @@ msgstr ""
msgid "8 Threads"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296
msgid "<font style='color:red'>"
msgstr ""
@ -80,6 +80,8 @@ msgid ""
"etc.</h3>"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:280
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601
@ -206,7 +208,7 @@ msgstr ""
msgid "Anti-pollution DNS Server"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148
msgid "Apple Domains DNS"
msgstr ""
@ -214,11 +216,11 @@ msgstr ""
msgid "Apple Domains Data"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:123
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143
msgid "Apple Domains Update url"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
msgid "Apple domains optimization"
msgstr ""
@ -366,7 +368,7 @@ msgstr ""
msgid "Check Server Port"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114
msgid "Check Try Count"
msgstr ""
@ -381,7 +383,7 @@ msgid ""
"release page."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109
msgid "Check timout(second)"
msgstr ""
@ -403,15 +405,15 @@ msgstr ""
msgid "ChinaDNS-NG query protocol"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133
msgid "Chnroute Update url"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134
msgid "Clang.CN"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:115
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135
msgid "Clang.CN.CIDR"
msgstr ""
@ -454,7 +456,7 @@ msgstr ""
msgid "Clear logs"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:264
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:300
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1097
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479
@ -663,7 +665,7 @@ msgstr ""
msgid "Default"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:121
msgid "Default Node Local Port"
msgstr ""
@ -704,7 +706,7 @@ msgid ""
"entries before the original Clash rules."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:302
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:338
msgid "Delay (ms)"
msgstr ""
@ -766,7 +768,7 @@ msgstr ""
msgid "DoT upstream (Need use wolfssl version)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:289
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:325
msgid "Domain Strategy"
msgstr ""
@ -816,9 +818,9 @@ msgstr ""
msgid "Edit ShadowSocksR Server"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:314
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581
@ -835,7 +837,7 @@ msgstr ""
msgid "Enable Authentication"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:80
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739
msgid "Enable Auto Switch"
msgstr ""
@ -890,7 +892,7 @@ msgstr ""
msgid "Enable V3 protocol."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:154
msgid "Enable adblock"
msgstr ""
@ -906,7 +908,7 @@ msgstr ""
msgid "Enabled Kernel virtual NIC TUN(optional)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201
msgid "Enabled Mixed"
msgstr ""
@ -1048,13 +1050,13 @@ msgstr ""
msgid "Flow"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
msgid ""
"For Apple domains equipped with Chinese mainland CDN, always responsive to "
"Chinese CDN IP addresses"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:262
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298
msgid "For specific usage, see:"
msgstr ""
@ -1064,27 +1066,27 @@ msgid ""
"(,)."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248
msgid "Fragment"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:273
msgid "Fragment Delay"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
msgid "Fragment Length"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251
msgid "Fragment Packets"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:281
msgid "Fragmentation interval (ms)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:268
msgid "Fragmented packet length (byte)"
msgstr ""
@ -1134,7 +1136,7 @@ msgstr ""
msgid "Global Client"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:194
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213
msgid "Global HTTP/HTTPS Proxy Server"
msgstr ""
@ -1143,7 +1145,7 @@ msgstr ""
msgid "Global Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204
msgid "Global SOCKS5 Proxy Server"
msgstr ""
@ -1195,7 +1197,7 @@ msgstr ""
msgid "HTTP"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222
msgid "HTTP Auth Mode"
msgstr ""
@ -1204,7 +1206,7 @@ msgstr ""
msgid "HTTP Host"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232
msgid "HTTP Password"
msgstr ""
@ -1213,11 +1215,11 @@ msgstr ""
msgid "HTTP Path"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
msgid "HTTP User"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222
msgid "HTTP proxy auth method, default:none."
msgstr ""
@ -1280,7 +1282,7 @@ msgstr ""
msgid "IP Stack Preference"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148
msgid "If empty, Not change Apple domains parsing DNS (Default is empty)"
msgstr ""
@ -1479,7 +1481,7 @@ msgstr ""
msgid "Level 3 Public DNS-3 (4.2.2.3-4)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286
msgid "Limit the maximum number of splits."
msgstr ""
@ -1498,8 +1500,8 @@ msgstr ""
msgid "Loading..."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237
msgid "Local Port"
msgstr ""
@ -1519,11 +1521,11 @@ msgstr ""
msgid "Loop Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129
msgid "Loukky/gfwlist-by-loukky"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
msgid "Loyalsoldier/v2ray-rules-dat"
msgstr ""
@ -1558,7 +1560,7 @@ msgstr ""
msgid "Max Early Data"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286
msgid "Max Split"
msgstr ""
@ -1611,7 +1613,7 @@ msgstr ""
msgid "Missing xz support"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201
msgid "Mixed as an alias of socks, default:Enabled."
msgstr ""
@ -1644,7 +1646,7 @@ msgstr ""
msgid "Mux"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158
msgid "NEO DEV HOST"
msgstr ""
@ -1730,7 +1732,7 @@ msgid ""
"the table."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291
msgid "Noise"
msgstr ""
@ -1768,6 +1770,18 @@ msgid ""
"compatibility issues."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282
msgid ""
"Note: When version is higher than 26.6.1, input multiple fragment intervals "
"saperate with ','."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269
msgid ""
"Note: When version is higher than 26.6.1, input multiple fragment lengths "
"saperate with ','."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644
msgid "Number of early established connections to reduce latency."
msgstr ""
@ -1804,19 +1818,19 @@ msgstr ""
msgid "Only Common Ports"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
msgid "Only when HTTP Auth Mode is password valid, Mandatory."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232
msgid "Only when HTTP Auth Mode is password valid, Not mandatory."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190
msgid "Only when Socks5 Auth Mode is password valid, Mandatory."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195
msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr ""
@ -1838,11 +1852,11 @@ msgstr ""
msgid "Package Name"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:261
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:297
msgid "Packet or Rand length as a string, e.g., 10-20."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334
msgid "Packet | Rand Length"
msgstr ""
@ -2129,7 +2143,7 @@ msgstr ""
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164
msgid "Reset to defaults"
msgstr ""
@ -2258,7 +2272,7 @@ msgstr ""
msgid "Server Type"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:73
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:93
msgid "Server failsafe auto swith and custom update settings"
msgstr ""
@ -2368,7 +2382,7 @@ msgstr ""
msgid "Socks Version"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183
msgid "Socks protocol auth methods, default:noauth."
msgstr ""
@ -2377,15 +2391,15 @@ msgstr ""
msgid "Socks5"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183
msgid "Socks5 Auth Mode"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195
msgid "Socks5 Password"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190
msgid "Socks5 User"
msgstr ""
@ -2466,7 +2480,7 @@ msgstr ""
msgid "Successfully retrieved certificate name:"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162
msgid "Support AdGuardHome and DNSMASQ format list"
msgstr ""
@ -2480,7 +2494,7 @@ msgid ""
"a maximum length of 3 bytes."
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104
msgid "Switch check cycly(second)"
msgstr ""
@ -2509,7 +2523,7 @@ msgstr ""
msgid "TCP Fast Open"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248
msgid ""
"TCP fragments, which can deceive the censorship system in some cases, such "
"as bypassing SNI blacklists."
@ -2644,7 +2658,7 @@ msgstr ""
msgid "Timeout for establishing a connection to server(second)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296
msgid "To send noise packets, select \"Noise\" in Xray Settings."
msgstr ""
@ -2675,7 +2689,7 @@ msgstr ""
msgid "Try Count"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:318
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695
msgid "Type"
msgstr ""
@ -2684,7 +2698,7 @@ msgstr ""
msgid "UDP"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291
msgid ""
"UDP noise, Under some circumstances it can bypass some UDP based protocol "
"restrictions."
@ -3009,11 +3023,11 @@ msgstr ""
msgid "Xray"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
msgid "Xray Fragment Settings"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:294
msgid "Xray Noise Packets"
msgstr ""
@ -3032,7 +3046,7 @@ msgstr ""
msgid "YAML Reloaded!"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:137
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
msgid "adblock_url"
msgstr ""
@ -3060,7 +3074,7 @@ msgstr ""
msgid "android"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159
msgid "anti-AD"
msgstr ""
@ -3068,7 +3082,7 @@ msgstr ""
msgid "chacha20-poly1305"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136
msgid "china-operator-ip"
msgstr ""
@ -3114,7 +3128,7 @@ msgstr ""
msgid "edge"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144
msgid "felixonmars/dnsmasq-china-list"
msgstr ""
@ -3135,11 +3149,11 @@ msgstr ""
msgid "gRPC Service Name"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126
msgid "gfwlist Update url"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130
msgid "gfwlist/gfwlist"
msgstr ""
@ -3235,7 +3249,7 @@ msgstr ""
msgid "spiderX"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127
msgid "v2fly/domain-list-community"
msgstr ""

View File

@ -1,7 +1,7 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251
msgid ""
"\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 "
"data writes by the client. \"tlshello\" is for TLS client hello packet "
@ -66,7 +66,7 @@ msgstr ""
msgid "8 Threads"
msgstr "8 线程"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296
msgid "<font style='color:red'>"
msgstr ""
@ -84,6 +84,8 @@ msgstr ""
"<h3>支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/CLASH 等协"
"议。</h3>"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:280
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601
@ -210,7 +212,7 @@ msgstr "JSON 格式的 FinalMaskObject用来实现分享。"
msgid "Anti-pollution DNS Server"
msgstr "访问国外域名 DNS 服务器"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148
msgid "Apple Domains DNS"
msgstr "Apple 域名 DNS"
@ -218,11 +220,11 @@ msgstr "Apple 域名 DNS"
msgid "Apple Domains Data"
msgstr "【Apple 域名】数据库"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:123
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143
msgid "Apple Domains Update url"
msgstr "Apple 域名更新 URL"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
msgid "Apple domains optimization"
msgstr "Apple 域名解析优化"
@ -370,7 +372,7 @@ msgstr "检查服务器"
msgid "Check Server Port"
msgstr "【服务器端口】检查"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114
msgid "Check Try Count"
msgstr "切换检查重试次数"
@ -385,7 +387,7 @@ msgid ""
"release page."
msgstr "检测已安装组件版本,并从上游发布页在线升级。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109
msgid "Check timout(second)"
msgstr "切换检查超时时间(秒)"
@ -407,15 +409,15 @@ msgstr "【中国大陆 IP 段】数据库"
msgid "ChinaDNS-NG query protocol"
msgstr "ChinaDNS-NG 查询协议"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133
msgid "Chnroute Update url"
msgstr "中国大陆 IP 段更新 URL"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134
msgid "Clang.CN"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:115
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135
msgid "Clang.CN.CIDR"
msgstr ""
@ -458,7 +460,7 @@ msgstr "清空所有自定义客户端代理规则,并恢复为空白状态吗
msgid "Clear logs"
msgstr "清空日志"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:264
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:300
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1097
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479
@ -668,7 +670,7 @@ msgstr "解密"
msgid "Default"
msgstr "默认"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:121
msgid "Default Node Local Port"
msgstr "节点默认本地端口"
@ -713,7 +715,7 @@ msgstr ""
"为每个客户端指定 Mihomo 代理目标。规则会以 SRC-IP-CIDR 形式注入到原始 Clash "
"规则之前。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:302
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:338
msgid "Delay (ms)"
msgstr "延迟ms"
@ -775,7 +777,7 @@ msgstr "是否要恢复客户端默认配置?"
msgid "DoT upstream (Need use wolfssl version)"
msgstr "DoT 上游(需使用 wolfssl 版本)"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:289
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:325
msgid "Domain Strategy"
msgstr "域名解析策略"
@ -825,9 +827,9 @@ msgstr "编辑"
msgid "Edit ShadowSocksR Server"
msgstr "编辑服务器配置"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:314
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581
@ -844,7 +846,7 @@ msgstr "客户端启用 0-RTT QUIC 连接握手"
msgid "Enable Authentication"
msgstr "启用用户名/密码认证"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:80
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739
msgid "Enable Auto Switch"
msgstr "启用自动切换"
@ -899,7 +901,7 @@ msgstr "开启 V2 协议。"
msgid "Enable V3 protocol."
msgstr "开启 V3 协议。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:154
msgid "Enable adblock"
msgstr "启用广告屏蔽"
@ -915,7 +917,7 @@ msgstr "启用此选项配置 XHTTP 附加项JSON 格式)。"
msgid "Enabled Kernel virtual NIC TUN(optional)"
msgstr "启用内核的虚拟网卡 TUN可选"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201
msgid "Enabled Mixed"
msgstr "启用 Mixed"
@ -1057,13 +1059,13 @@ msgstr "指纹伪造"
msgid "Flow"
msgstr "流控Flow"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
msgid ""
"For Apple domains equipped with Chinese mainland CDN, always responsive to "
"Chinese CDN IP addresses"
msgstr "配备中国大陆 CDN 的 Apple 域名,始终应答中国大陆 CDN 地址"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:262
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298
msgid "For specific usage, see:"
msgstr "具体使用方法,具体请参见:"
@ -1073,27 +1075,27 @@ msgid ""
"(,)."
msgstr "格式为10000:20000 或 10000-20000 多组时用逗号(,)隔开。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248
msgid "Fragment"
msgstr "分片"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:273
msgid "Fragment Delay"
msgstr "分片延迟"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
msgid "Fragment Length"
msgstr "分片包长"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251
msgid "Fragment Packets"
msgstr "分片方式"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:281
msgid "Fragmentation interval (ms)"
msgstr "分片间隔ms"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:268
msgid "Fragmented packet length (byte)"
msgstr "分片包长 (byte)"
@ -1143,7 +1145,7 @@ msgstr "GitHub 直连"
msgid "Global Client"
msgstr "TCP 透明代理"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:194
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213
msgid "Global HTTP/HTTPS Proxy Server"
msgstr "HTTP/HTTPS 代理服务端(全局)"
@ -1152,7 +1154,7 @@ msgstr "HTTP/HTTPS 代理服务端(全局)"
msgid "Global Mode"
msgstr "全局模式"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204
msgid "Global SOCKS5 Proxy Server"
msgstr "SOCKS5 代理服务端(全局)"
@ -1204,7 +1206,7 @@ msgstr "H2/gRPC 健康检查"
msgid "HTTP"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222
msgid "HTTP Auth Mode"
msgstr "HTTP 认证模式"
@ -1213,7 +1215,7 @@ msgstr "HTTP 认证模式"
msgid "HTTP Host"
msgstr "HTTP 主机名"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232
msgid "HTTP Password"
msgstr "HTTP 密码"
@ -1222,11 +1224,11 @@ msgstr "HTTP 密码"
msgid "HTTP Path"
msgstr "HTTP 路径"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
msgid "HTTP User"
msgstr "HTTP 用户名"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222
msgid "HTTP proxy auth method, default:none."
msgstr "HTTP 代理认证方式默认none。"
@ -1289,7 +1291,7 @@ msgstr "绕过中国大陆 IP 模式"
msgid "IP Stack Preference"
msgstr "IP 栈优先级"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148
msgid "If empty, Not change Apple domains parsing DNS (Default is empty)"
msgstr "如果为空,则不更改 Apple 域名解析 DNS默认为空"
@ -1489,7 +1491,7 @@ msgstr ""
msgid "Level 3 Public DNS-3 (4.2.2.3-4)"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286
msgid "Limit the maximum number of splits."
msgstr "限制分片的最大数量。"
@ -1508,8 +1510,8 @@ msgstr "仅监听指定的接口,未指定则监听全部。"
msgid "Loading..."
msgstr "加载中..."
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237
msgid "Local Port"
msgstr "本地端口"
@ -1529,11 +1531,11 @@ msgstr "日志"
msgid "Loop Mode"
msgstr "循环模式"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129
msgid "Loukky/gfwlist-by-loukky"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128
msgid "Loyalsoldier/v2ray-rules-dat"
msgstr ""
@ -1570,7 +1572,7 @@ msgstr "未找到匹配的发布资产"
msgid "Max Early Data"
msgstr "最大前置数据"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286
msgid "Max Split"
msgstr "最大分片数"
@ -1625,7 +1627,7 @@ msgstr "缺少 unzip 支持"
msgid "Missing xz support"
msgstr "缺少 xz 支持"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201
msgid "Mixed as an alias of socks, default:Enabled."
msgstr "Mixed 作为 SOCKS 的别名,默认:启用。"
@ -1658,7 +1660,7 @@ msgstr "必须是 JSON 文本内容!"
msgid "Mux"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158
msgid "NEO DEV HOST"
msgstr ""
@ -1745,7 +1747,7 @@ msgid ""
msgstr ""
"节点顺序可用鼠标拖拉后立即生效,服务器节点自动切换顺序和表中节点顺序一致。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291
msgid "Noise"
msgstr "噪声"
@ -1783,6 +1785,18 @@ msgid ""
"compatibility issues."
msgstr "注意:不同版本间的配置恢复可能会导致兼容性问题。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282
msgid ""
"Note: When version is higher than 26.6.1, input multiple fragment intervals "
"saperate with ','."
msgstr "注意:当版本高于 26.6.1 时,可以输入多个分片间隔,并用英文 ',' 分隔。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269
msgid ""
"Note: When version is higher than 26.6.1, input multiple fragment lengths "
"saperate with ','."
msgstr "注意:当版本高于 26.6.1 时,可以输入多个分片长度,并用英文 ',' 分隔。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644
msgid "Number of early established connections to reduce latency."
msgstr "预连接的数量,用于降低延迟。"
@ -1819,19 +1833,19 @@ msgstr "设置后,仅在服务器证书链指纹匹配时连接。"
msgid "Only Common Ports"
msgstr "仅常用端口(不走 P2P 流量到代理)"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
msgid "Only when HTTP Auth Mode is password valid, Mandatory."
msgstr "仅当 HTTP 认证模式为 password 时有效,必填。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232
msgid "Only when HTTP Auth Mode is password valid, Not mandatory."
msgstr "仅当 HTTP 认证模式为 password 时有效,非必填。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190
msgid "Only when Socks5 Auth Mode is password valid, Mandatory."
msgstr "仅当 Socks5 认证方式为 Password 时有效,必填。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195
msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。"
@ -1853,11 +1867,11 @@ msgstr ""
msgid "Package Name"
msgstr "组件包名称"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:261
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:297
msgid "Packet or Rand length as a string, e.g., 10-20."
msgstr "数据包或 Rand 长度以字符串形式输入例如10-20。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334
msgid "Packet | Rand Length"
msgstr "数据包 | Rand 长度"
@ -2144,7 +2158,7 @@ msgstr "重置完成"
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值吗?"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164
msgid "Reset to defaults"
msgstr "恢复出厂设置"
@ -2274,7 +2288,7 @@ msgstr "服务端配置"
msgid "Server Type"
msgstr "服务端类型"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:73
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:93
msgid "Server failsafe auto swith and custom update settings"
msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置"
@ -2384,7 +2398,7 @@ msgstr ""
msgid "Socks Version"
msgstr "Socks 版本"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183
msgid "Socks protocol auth methods, default:noauth."
msgstr "Socks 协议的认证方式默认值noauth。"
@ -2393,15 +2407,15 @@ msgstr "Socks 协议的认证方式默认值noauth。"
msgid "Socks5"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183
msgid "Socks5 Auth Mode"
msgstr "Socks5 认证方式"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195
msgid "Socks5 Password"
msgstr "Socks5 密码"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190
msgid "Socks5 User"
msgstr "Socks5 用户名"
@ -2482,7 +2496,7 @@ msgstr "已成功获取证书指纹:"
msgid "Successfully retrieved certificate name:"
msgstr "已成功获取证书名称:"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162
msgid "Support AdGuardHome and DNSMASQ format list"
msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表"
@ -2498,7 +2512,7 @@ msgstr ""
"支持以“,”分隔的十进制数字,或者经过 Base64 编码的字符串,其最大长度为 3 个字"
"节。"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104
msgid "Switch check cycly(second)"
msgstr "自动切换检查周期(秒)"
@ -2527,7 +2541,7 @@ msgstr "TCP 伪装类型"
msgid "TCP Fast Open"
msgstr "TCP 快速打开"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248
msgid ""
"TCP fragments, which can deceive the censorship system in some cases, such "
"as bypassing SNI blacklists."
@ -2670,7 +2684,7 @@ msgstr "超时"
msgid "Timeout for establishing a connection to server(second)"
msgstr "连接超时时间(单位:秒)"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296
msgid "To send noise packets, select \"Noise\" in Xray Settings."
msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。"
@ -2701,7 +2715,7 @@ msgstr "Trojan 密码"
msgid "Try Count"
msgstr "重试次数"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:318
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695
msgid "Type"
msgstr "类型"
@ -2710,7 +2724,7 @@ msgstr "类型"
msgid "UDP"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291
msgid ""
"UDP noise, Under some circumstances it can bypass some UDP based protocol "
"restrictions."
@ -3037,11 +3051,11 @@ msgstr ""
msgid "Xray"
msgstr "Xray"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245
msgid "Xray Fragment Settings"
msgstr "Xray 分片设置"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:294
msgid "Xray Noise Packets"
msgstr "Xray 噪声数据包"
@ -3060,7 +3074,7 @@ msgstr "YAML 重载失败!"
msgid "YAML Reloaded!"
msgstr "YAML 已重载!"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:137
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157
msgid "adblock_url"
msgstr "广告屏蔽更新 URL"
@ -3088,7 +3102,7 @@ msgstr "allowedIPs可选"
msgid "android"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159
msgid "anti-AD"
msgstr ""
@ -3096,7 +3110,7 @@ msgstr ""
msgid "chacha20-poly1305"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136
msgid "china-operator-ip"
msgstr ""
@ -3142,7 +3156,7 @@ msgstr "例如:/etc/ssl/private.key"
msgid "edge"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144
msgid "felixonmars/dnsmasq-china-list"
msgstr ""
@ -3163,11 +3177,11 @@ msgstr "gRPC 模式"
msgid "gRPC Service Name"
msgstr "gRPC 服务名称"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126
msgid "gfwlist Update url"
msgstr "GFW 列表更新 URL"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130
msgid "gfwlist/gfwlist"
msgstr ""
@ -3264,7 +3278,7 @@ msgstr ""
msgid "spiderX"
msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127
msgid "v2fly/domain-list-community"
msgstr ""

View File

@ -59,10 +59,14 @@ local function parse_realm_uri(uri)
local scheme, token, server_url, realm_id, query = trim(uri):match("^(realm%+http|realm)://([^@]+)@([^/]+)/([^?]*)%??(.*)$")
if not scheme or not token or not server_url or not realm_id then return nil end
realm_id = realm_id:gsub("/+$", "")
local address, port = server_url:match("^%[?([^%]]+)%]?:?(%d*)$")
port = tonumber(port) or (scheme == "realm+http" and 80 or 443)
local realm = {
scheme = scheme,
token = token,
server_url = server_url,
address = address,
port = port,
realm_id = realm_id
}
-- 解析 query 中的 stun=
@ -292,6 +296,15 @@ function xray_hysteria2()
address = server.server,
port = tonumber(server.server_port)
}
-- Realm 支持:使用 Realm 服务器地址覆盖默认地址
if server.v2ray_protocol == "hysteria2" and server.hysteria2_realms then
local realm = parse_realm_uri(server.hysteria2_realm_url)
if realm then
outbound_settings.address = realm.address
outbound_settings.port = realm.port
end
end
end
local outbound = {}
function outbound:new(o)
@ -700,15 +713,56 @@ Xray.outbounds = {
local n_maxsplit = xray_fragment.fragment_maxSplit
--local domainstr = xray_noise.domainStrategy
finalmask.tcp = finalmask.tcp or {}
-- 辅助函数:将逗号分隔的字符串拆分为数组
local function split_to_array(str)
if not str or str == "" then return nil end
local result = {}
for value in string.gmatch(str, "[^,]+") do
value = value:gsub("^%s*(.-)%s*$", "%1") -- 去除首尾空格
if value ~= "" then
table.insert(result, value)
end
end
return #result > 0 and result or nil
end
-- 构建 fragment settings
local fragment_settings = {
packets = (n_packets and n_packets ~= "") and n_packets or nil,
maxSplit = (n_maxsplit and n_maxsplit ~= "") and n_maxsplit or nil
}
-- 根据 Xray 版本决定使用旧格式还是新格式
if xray_version_val <= 260601 then
-- 旧版本:使用 length 和 delay单个值
if n_length and n_length ~= "" then
fragment_settings.length = n_length
end
if n_delay and n_delay ~= "" then
if type(n_delay) == "string" and n_delay:find("-", 1, true) then
fragment_settings.delay = n_delay
else
fragment_settings.delay = tonumber(n_delay)
end
end
else
-- 新版本:使用 lengths 和 delays数组
-- 拆分逗号分隔的字符串
local lengths_array = split_to_array(n_length)
if lengths_array then
fragment_settings.lengths = lengths_array
end
local delays_array = split_to_array(n_delay)
if delays_array then
fragment_settings.delays = delays_array
end
end
finalmask.tcp[#finalmask.tcp + 1] = {
type = "fragment",
settings = {
--domainStrategy = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and domainstr or nil,
packets = (n_packets and n_packets ~= "") and n_packets or nil,
length = (n_length and n_length ~= "") and n_length or nil,
delay = (type(n_delay) == "string" and string.find(n_delay, "-")) and n_delay or (n_delay and tonumber(n_delay)),
maxSplit = (n_maxsplit and n_maxsplit ~= "") and n_maxsplit or nil
}
settings = fragment_settings
}
end
if xray_fragment.noise == "1" and (TP == "kcp" or (TP == "xhttp" and (server.tls_alpn == "h3" or server.tls_alpn == "h3,h2"))) then

View File

@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=natflow
PKG_VERSION:=20260531
PKG_RELEASE:=19
PKG_RELEASE:=20
PKG_SOURCE:=$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=https://github.com/ptpt52/natflow.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=d048ff525d0ab9780a2af16a56a1359b7b14beb4
PKG_SOURCE_VERSION:=c1f7aae14a67a8a2f8edd9641c69ccf77654c42a
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>
PKG_LICENSE:=GPL-2.0