fix(updates): предотвратить повторные модальные окна и добавить активную проверку готовности сервисов роутера перед перезагрузкой страницы

This commit is contained in:
Dushnilin
2026-08-17 10:27:16 +03:00
parent beb132690e
commit bca948947e
10 changed files with 492 additions and 277 deletions
+74 -39
View File
@@ -507,7 +507,7 @@
"call": "Another component action is already running",
"key": "Another component action is already running",
"places": [
"src/tachyon/tabs/updates/initController.ts:844"
"src/tachyon/tabs/updates/initController.ts:861"
]
},
{
@@ -1003,7 +1003,7 @@
"call": "Check update",
"key": "Check update",
"places": [
"src/tachyon/tabs/updates/initController.ts:913"
"src/tachyon/tabs/updates/initController.ts:930"
]
},
{
@@ -1081,17 +1081,17 @@
"call": "Checks failed",
"key": "Checks failed",
"places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10"
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10",
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26"
]
},
{
"call": "Checks passed",
"key": "Checks passed",
"places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23",
"src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43"
"src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43",
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13"
]
},
{
@@ -1183,8 +1183,8 @@
"src/tachyon/tabs/monitoring/initController.ts:884",
"src/tachyon/tabs/monitoring/initController.ts:934",
"src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419"
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451"
]
},
{
@@ -2602,7 +2602,7 @@
"src/tachyon/tabs/updates/initController.ts:619",
"src/tachyon/tabs/updates/initController.ts:620",
"src/tachyon/tabs/updates/initController.ts:695",
"src/tachyon/tabs/updates/initController.ts:891"
"src/tachyon/tabs/updates/initController.ts:908"
]
},
{
@@ -3422,22 +3422,22 @@
"call": "Install",
"key": "Install",
"places": [
"src/tachyon/tabs/updates/initController.ts:927",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363"
"src/tachyon/tabs/updates/initController.ts:944",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395"
]
},
{
"call": "Install another build:",
"key": "Install another build:",
"places": [
"src/tachyon/tabs/updates/initController.ts:1421"
"src/tachyon/tabs/updates/initController.ts:1438"
]
},
{
"call": "Installed build → Available build",
"key": "Installed build → Available build",
"places": [
"src/tachyon/tabs/updates/initController.ts:1279"
"src/tachyon/tabs/updates/initController.ts:1296"
]
},
{
@@ -3445,7 +3445,7 @@
"key": "Installed version is newer than release",
"places": [
"src/tachyon/tabs/updates/initController.ts:341",
"src/tachyon/tabs/updates/initController.ts:1287"
"src/tachyon/tabs/updates/initController.ts:1304"
]
},
{
@@ -4029,8 +4029,8 @@
"call": "Issues detected",
"key": "Issues detected",
"places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17"
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17",
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20"
]
},
{
@@ -4190,14 +4190,14 @@
"key": "Latest version is installed",
"places": [
"src/tachyon/tabs/updates/initController.ts:344",
"src/tachyon/tabs/updates/initController.ts:1285"
"src/tachyon/tabs/updates/initController.ts:1302"
]
},
{
"call": "Latest version:",
"key": "Latest version:",
"places": [
"src/tachyon/tabs/updates/initController.ts:1287"
"src/tachyon/tabs/updates/initController.ts:1304"
]
},
{
@@ -4305,11 +4305,11 @@
"call": "Loading...",
"key": "Loading...",
"places": [
"src/tachyon/tabs/updates/initController.ts:1129",
"src/tachyon/tabs/updates/initController.ts:1144",
"src/tachyon/tabs/updates/initController.ts:1162",
"src/tachyon/tabs/updates/initController.ts:1176",
"src/tachyon/tabs/updates/initController.ts:1190"
"src/tachyon/tabs/updates/initController.ts:1146",
"src/tachyon/tabs/updates/initController.ts:1161",
"src/tachyon/tabs/updates/initController.ts:1179",
"src/tachyon/tabs/updates/initController.ts:1193",
"src/tachyon/tabs/updates/initController.ts:1207"
]
},
{
@@ -4852,9 +4852,9 @@
"places": [
"src/tachyon/helpers/singBoxVariant.ts:38",
"src/tachyon/helpers/singBoxVariant.ts:46",
"src/tachyon/tabs/updates/initController.ts:1165",
"src/tachyon/tabs/updates/initController.ts:1179",
"src/tachyon/tabs/updates/initController.ts:1193"
"src/tachyon/tabs/updates/initController.ts:1182",
"src/tachyon/tabs/updates/initController.ts:1196",
"src/tachyon/tabs/updates/initController.ts:1210"
]
},
{
@@ -5039,8 +5039,8 @@
"call": "Open",
"key": "Open",
"places": [
"src/tachyon/tabs/updates/initController.ts:1261",
"src/tachyon/tabs/updates/initController.ts:1300"
"src/tachyon/tabs/updates/initController.ts:1278",
"src/tachyon/tabs/updates/initController.ts:1317"
]
},
{
@@ -5068,7 +5068,7 @@
"call": "Operation failed",
"key": "Operation failed",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414"
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446"
]
},
{
@@ -5662,7 +5662,7 @@
"call": "Rebuilt release",
"key": "Rebuilt release",
"places": [
"src/tachyon/tabs/updates/initController.ts:1281"
"src/tachyon/tabs/updates/initController.ts:1298"
]
},
{
@@ -5739,14 +5739,21 @@
"call": "Reinstall",
"key": "Reinstall",
"places": [
"src/tachyon/tabs/updates/initController.ts:1041"
"src/tachyon/tabs/updates/initController.ts:1058"
]
},
{
"call": "Reloading page in",
"key": "Reloading page in",
"call": "Reload now",
"key": "Reload now",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329"
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342"
]
},
{
"call": "Reloading...",
"key": "Reloading...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371"
]
},
{
@@ -5768,7 +5775,7 @@
"key": "Remove",
"places": [
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927",
"src/tachyon/tabs/updates/initController.ts:997"
"src/tachyon/tabs/updates/initController.ts:1014"
]
},
{
@@ -6642,6 +6649,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819"
]
},
{
"call": "Services are online and ready! Reloading page...",
"key": "Services are online and ready! Reloading page...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370"
]
},
{
"call": "Services info",
"key": "Services info",
@@ -6649,6 +6663,13 @@
"src/tachyon/tabs/dashboard/initController.ts:1871"
]
},
{
"call": "Services restarted. Click to reload page.",
"key": "Services restarted. Click to reload page.",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384"
]
},
{
"call": "Settings",
"key": "Settings",
@@ -7713,7 +7734,7 @@
"call": "Transient connection error",
"key": "Transient connection error",
"places": [
"src/tachyon/tabs/updates/initController.ts:860"
"src/tachyon/tabs/updates/initController.ts:877"
]
},
{
@@ -7991,7 +8012,7 @@
"call": "Update",
"key": "Update",
"places": [
"src/tachyon/tabs/updates/initController.ts:927"
"src/tachyon/tabs/updates/initController.ts:944"
]
},
{
@@ -8005,14 +8026,14 @@
"call": "Update is available for current release",
"key": "Update is available for current release",
"places": [
"src/tachyon/tabs/updates/initController.ts:1268"
"src/tachyon/tabs/updates/initController.ts:1285"
]
},
{
"call": "Update is available:",
"key": "Update is available:",
"places": [
"src/tachyon/tabs/updates/initController.ts:1247"
"src/tachyon/tabs/updates/initController.ts:1264"
]
},
{
@@ -8275,6 +8296,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10286"
]
},
{
"call": "Verifying router and service readiness...",
"key": "Verifying router and service readiness...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365"
]
},
{
"call": "Via country.is",
"key": "Via country.is",
@@ -8304,6 +8332,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8755"
]
},
{
"call": "Waiting for router services to restart...",
"key": "Waiting for router services to restart...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337"
]
},
{
"call": "WAN",
"key": "WAN",
+57 -37
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 17:35+0300\n"
"PO-Revision-Date: 2026-08-16 17:35+0300\n"
"POT-Creation-Date: 2026-08-17 07:26+0300\n"
"PO-Revision-Date: 2026-08-17 07:26+0300\n"
"Last-Translator: Dushnilin <dushnilin@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Anonymized support report copied to clipboard"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:844
#: src/tachyon/tabs/updates/initController.ts:861
msgid "Another component action is already running"
msgstr ""
@@ -611,7 +611,7 @@ msgstr ""
msgid "Check timeout after which the server is considered dead"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:913
#: src/tachyon/tabs/updates/initController.ts:930
msgid "Check update"
msgstr ""
@@ -662,14 +662,14 @@ msgstr ""
msgid "checks"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23
#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed"
msgstr ""
@@ -725,8 +725,8 @@ msgstr ""
#: src/tachyon/tabs/monitoring/initController.ts:884
#: src/tachyon/tabs/monitoring/initController.ts:934
#: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451
msgid "Close"
msgstr ""
@@ -1562,7 +1562,7 @@ msgstr ""
#: src/tachyon/tabs/updates/initController.ts:619
#: src/tachyon/tabs/updates/initController.ts:620
#: src/tachyon/tabs/updates/initController.ts:695
#: src/tachyon/tabs/updates/initController.ts:891
#: src/tachyon/tabs/updates/initController.ts:908
msgid "Failed to execute"
msgstr ""
@@ -2043,21 +2043,21 @@ msgstr ""
msgid "Init Packet Payload (I5)"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363
#: src/tachyon/tabs/updates/initController.ts:944
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395
msgid "Install"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1421
#: src/tachyon/tabs/updates/initController.ts:1438
msgid "Install another build:"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1279
#: src/tachyon/tabs/updates/initController.ts:1296
msgid "Installed build → Available build"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:341
#: src/tachyon/tabs/updates/initController.ts:1287
#: src/tachyon/tabs/updates/initController.ts:1304
msgid "Installed version is newer than release"
msgstr ""
@@ -2395,8 +2395,8 @@ msgstr ""
msgid "Issues"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected"
msgstr ""
@@ -2490,11 +2490,11 @@ msgid "Latency test URL"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:344
#: src/tachyon/tabs/updates/initController.ts:1285
#: src/tachyon/tabs/updates/initController.ts:1302
msgid "Latest version is installed"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1287
#: src/tachyon/tabs/updates/initController.ts:1304
msgid "Latest version:"
msgstr ""
@@ -2557,11 +2557,11 @@ msgstr ""
msgid "Loading connections"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1129
#: src/tachyon/tabs/updates/initController.ts:1144
#: src/tachyon/tabs/updates/initController.ts:1162
#: src/tachyon/tabs/updates/initController.ts:1176
#: src/tachyon/tabs/updates/initController.ts:1190
#: src/tachyon/tabs/updates/initController.ts:1146
#: src/tachyon/tabs/updates/initController.ts:1161
#: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1207
msgid "Loading..."
msgstr ""
@@ -2879,9 +2879,9 @@ msgstr ""
#: src/tachyon/helpers/singBoxVariant.ts:38
#: src/tachyon/helpers/singBoxVariant.ts:46
#: src/tachyon/tabs/updates/initController.ts:1165
#: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1182
#: src/tachyon/tabs/updates/initController.ts:1196
#: src/tachyon/tabs/updates/initController.ts:1210
msgid "Not installed"
msgstr ""
@@ -2991,8 +2991,8 @@ msgstr ""
msgid "Only the specified servers."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1261
#: src/tachyon/tabs/updates/initController.ts:1300
#: src/tachyon/tabs/updates/initController.ts:1278
#: src/tachyon/tabs/updates/initController.ts:1317
msgid "Open"
msgstr ""
@@ -3008,7 +3008,7 @@ msgstr ""
msgid "Operation completed successfully!"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446
msgid "Operation failed"
msgstr ""
@@ -3356,7 +3356,7 @@ msgstr ""
msgid "Rebuild firewall rules"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1281
#: src/tachyon/tabs/updates/initController.ts:1298
msgid "Rebuilt release"
msgstr ""
@@ -3400,12 +3400,16 @@ msgstr ""
msgid "Regular expression must not contain spaces or commas"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1041
#: src/tachyon/tabs/updates/initController.ts:1058
msgid "Reinstall"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329
msgid "Reloading page in"
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342
msgid "Reload now"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371
msgid "Reloading..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847
@@ -3417,7 +3421,7 @@ msgid "Removal completed successfully!"
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927
#: src/tachyon/tabs/updates/initController.ts:997
#: src/tachyon/tabs/updates/initController.ts:1014
msgid "Remove"
msgstr ""
@@ -3935,10 +3939,18 @@ msgstr ""
msgid "Services & Access"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370
msgid "Services are online and ready! Reloading page..."
msgstr ""
#: src/tachyon/tabs/dashboard/initController.ts:1871
msgid "Services info"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384
msgid "Services restarted. Click to reload page."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232
msgid "Settings"
@@ -4555,7 +4567,7 @@ msgstr ""
msgid "Traffic will go through the default route (Direct/Default)."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:860
#: src/tachyon/tabs/updates/initController.ts:877
msgid "Transient connection error"
msgstr ""
@@ -4725,7 +4737,7 @@ msgstr ""
msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927
#: src/tachyon/tabs/updates/initController.ts:944
msgid "Update"
msgstr ""
@@ -4733,11 +4745,11 @@ msgstr ""
msgid "Update is available"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1268
#: src/tachyon/tabs/updates/initController.ts:1285
msgid "Update is available for current release"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1247
#: src/tachyon/tabs/updates/initController.ts:1264
msgid "Update is available:"
msgstr ""
@@ -4905,6 +4917,10 @@ msgstr ""
msgid "Value must not contain control characters"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365
msgid "Verifying router and service readiness..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986
msgid "Via country.is"
msgstr ""
@@ -4922,6 +4938,10 @@ msgstr ""
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337
msgid "Waiting for router services to restart..."
msgstr ""
#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70
msgid "WAN"
msgstr ""
+22 -4
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 20:35+0300\n"
"PO-Revision-Date: 2026-08-16 20:35+0300\n"
"POT-Creation-Date: 2026-08-17 10:26+0300\n"
"PO-Revision-Date: 2026-08-17 10:26+0300\n"
"Last-Translator: Dushnilin\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -2372,8 +2372,11 @@ msgstr "Регулярное выражение не должно содержа
msgid "Reinstall"
msgstr "Переустановить"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Reload now"
msgstr ""
msgid "Reloading..."
msgstr ""
msgid "Remote Hosts Lists"
msgstr "Удалённые списки Hosts"
@@ -2741,9 +2744,15 @@ msgstr "Список сервисов"
msgid "Services & Access"
msgstr "Сервисы и доступ"
msgid "Services are online and ready! Reloading page..."
msgstr ""
msgid "Services info"
msgstr "Информация о сервисах"
msgid "Services restarted. Click to reload page."
msgstr ""
msgid "Settings"
msgstr "Настройки"
@@ -3404,6 +3413,9 @@ msgstr "Значение не может быть пустым"
msgid "Value must not contain control characters"
msgstr "Значение не должно содержать символы управления"
msgid "Verifying router and service readiness..."
msgstr ""
msgid "Via country.is"
msgstr "Через country.is"
@@ -3416,6 +3428,9 @@ msgstr "Видимое имя этой секции"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "Waiting for router services to restart..."
msgstr ""
msgid "WAN"
msgstr "WAN"
@@ -3509,6 +3524,9 @@ msgstr "sing-box outbound для Zapret2 настроен"
msgid "Zapret2 sing-box outbound is not configured"
msgstr "sing-box outbound для Zapret2 не настроен"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Level"
msgstr "Уровень"
@@ -691,7 +691,9 @@ async function handleChooseOutbound(
const res = await TachyonShellMethods.setClashApiGroupProxy(selector, tag);
if (res && !(res as any).success && (res as any).error) {
showToast(
(res as any).message || (res as any).error || _('Failed to switch proxy'),
(res as any).message ||
(res as any).error ||
_('Failed to switch proxy'),
'error',
);
}
@@ -1122,59 +1124,64 @@ function renderCommonDetailsModal(
],
),
]
: (isPriority || section.outbounds.some((o) => o.code === member.code))
? [
E(
'button',
{
type: 'button',
class:
'btn cbi-button cbi-button-action tachyon_dashboard-page__urltest-details__select-btn',
click: async (event: MouseEvent) => {
event.preventDefault();
const btn = event.currentTarget as HTMLButtonElement | null;
if (btn) {
btn.disabled = true;
}
const targetSelector = isPriority
? (outbound?.code || section.code)
: section.code;
await handleChooseOutbound(
section.sectionName,
targetSelector,
member.code,
);
const updatedSection = store
.get()
.sectionsWidget.data.find(
(s) =>
s.sectionName === section.sectionName,
);
const updatedOutbound =
updatedSection?.outbounds.find(
(o) => o.code === outbound?.code,
);
if (updatedSection && updatedOutbound) {
if (isPriority) {
handleShowPriorityInfo(
updatedSection,
updatedOutbound,
);
} else {
handleShowUrlTestInfo(
updatedSection,
updatedOutbound,
);
: isPriority ||
section.outbounds.some(
(o) => o.code === member.code,
)
? [
E(
'button',
{
type: 'button',
class:
'btn cbi-button cbi-button-action tachyon_dashboard-page__urltest-details__select-btn',
click: async (event: MouseEvent) => {
event.preventDefault();
const btn =
event.currentTarget as HTMLButtonElement | null;
if (btn) {
btn.disabled = true;
}
} else {
ui.hideModal();
}
const targetSelector = isPriority
? outbound?.code || section.code
: section.code;
await handleChooseOutbound(
section.sectionName,
targetSelector,
member.code,
);
const updatedSection = store
.get()
.sectionsWidget.data.find(
(s) =>
s.sectionName ===
section.sectionName,
);
const updatedOutbound =
updatedSection?.outbounds.find(
(o) => o.code === outbound?.code,
);
if (updatedSection && updatedOutbound) {
if (isPriority) {
handleShowPriorityInfo(
updatedSection,
updatedOutbound,
);
} else {
handleShowUrlTestInfo(
updatedSection,
updatedOutbound,
);
}
} else {
ui.hideModal();
}
},
},
},
_('Select'),
),
]
: []
_('Select'),
),
]
: []
: []),
member.canCopyLink
? renderUrlTestCopyButton(
@@ -1503,8 +1503,7 @@ async function handleRunAiDoctor() {
}),
renderButton({
classNames: ['cbi-button-reset'],
text:
'🚨 ' + _('Restore Native Internet (Stop Tachyon)'),
text: '🚨 ' + _('Restore Native Internet (Stop Tachyon)'),
onClick: async () => {
showToast(
_(
@@ -1512,10 +1511,9 @@ async function handleRunAiDoctor() {
),
'success',
);
const fixRes =
await TachyonShellMethods.applyQuickFix(
'restore_native_internet',
);
const fixRes = await TachyonShellMethods.applyQuickFix(
'restore_native_internet',
);
if (
fixRes &&
typeof fixRes === 'object' &&
@@ -1609,10 +1607,9 @@ function handleRestoreNativeInternet() {
_('Restoring native direct internet (stopping Tachyon)...'),
'success',
);
const res =
await TachyonShellMethods.applyQuickFix(
'restore_native_internet',
);
const res = await TachyonShellMethods.applyQuickFix(
'restore_native_internet',
);
if (
res &&
typeof res === 'object' &&
@@ -750,7 +750,21 @@ function isComponentActionAlreadyRunningError(message: string | undefined) {
function handleComponentUiState(uiState: Tachyon.UiState) {
for (const state of uiState.actions.component || []) {
void followComponentActionState(state);
const jobId = state.job_id;
if (!jobId) {
continue;
}
if (handledComponentJobs.has(jobId) || followedComponentJobs.has(jobId)) {
continue;
}
if (state.running) {
void followComponentActionState(state);
} else {
handledComponentJobs.add(jobId);
void ackComponentActionJob(jobId);
}
}
}
@@ -811,15 +825,18 @@ async function handleComponentAction(button: ComponentActionButton) {
const currentSha = checkResult?.current_sha;
const targetSha = checkResult?.latest_sha;
const modalController = showUpdateProgressModal({
component: button.component,
action: button.action,
componentTitle: cardTitle,
currentVersion,
targetVersion,
currentSha,
targetSha,
});
let modalController = getActiveProgressModalController();
if (!modalController) {
modalController = showUpdateProgressModal({
component: button.component,
action: button.action,
componentTitle: cardTitle,
currentVersion,
targetVersion,
currentSha,
targetSha,
});
}
let jobId = '';
let ownsJobFollow = false;
@@ -867,15 +884,15 @@ async function handleComponentAction(button: ComponentActionButton) {
}
jobId = startResponse.data.job_id;
setActiveProgressModalJobId(jobId);
markUiActionOwned('component', jobId);
modalController.startLogTracking(jobId);
if (followedComponentJobs.has(jobId)) {
if (followedComponentJobs.has(jobId) || handledComponentJobs.has(jobId)) {
return;
}
followedComponentJobs.add(jobId);
ownsJobFollow = true;
setActiveProgressModalJobId(jobId);
markUiActionOwned('component', jobId);
modalController.startLogTracking(jobId);
const response = await TachyonShellMethods.waitComponentActionJob(
jobId,
@@ -144,9 +144,13 @@ export function showUpdateProgressModal(
timerBadgeEl,
]);
const logPreEl = E('pre', {
class: 'tachyon-update-modal__log',
}, _('Operation started. Waiting for log output...')) as HTMLPreElement;
const logPreEl = E(
'pre',
{
class: 'tachyon-update-modal__log',
},
_('Operation started. Waiting for log output...'),
) as HTMLPreElement;
const logPanelEl = E('div', { class: 'tachyon-update-modal__log-panel' }, [
E('div', { class: 'tachyon-update-modal__log-header' }, [
@@ -318,42 +322,78 @@ export function showUpdateProgressModal(
? _('Removal completed successfully!')
: _('Operation completed successfully!'));
const bannerEl = E('div', { class: 'tachyon-update-modal__success-banner' }, [
renderCheckIcon24(),
E('span', {}, successMsg),
]);
const bannerEl = E(
'div',
{ class: 'tachyon-update-modal__success-banner' },
[renderCheckIcon24(), E('span', {}, successMsg)],
);
if (opts?.reloadPage) {
let secondsLeft = 3;
const reloadBtnText = () =>
`${_('Reloading page in')} ${secondsLeft}s...`;
let isProbing = true;
let attempt = 0;
const maxAttempts = 30;
const statusEl = E(
'div',
{
class: 'tachyon-update-modal__reload-status',
style:
'margin: 10px 0; font-size: 0.95em; color: var(--cbi-color-neutral, #666);',
},
_('Waiting for router services to restart...'),
);
const reloadBtn = renderButton({
classNames: ['cbi-button-save'],
text: reloadBtnText(),
text: _('Reload now'),
onClick: () => {
isProbing = false;
window.location.reload();
},
});
actionButtonContainer.replaceChildren(
bannerEl,
E(
'div',
{ class: 'tachyon-update-modal__action-buttons' },
[reloadBtn],
),
statusEl,
E('div', { class: 'tachyon-update-modal__action-buttons' }, [
reloadBtn,
]),
);
const reloadTimer = setInterval(() => {
secondsLeft -= 1;
if (secondsLeft <= 0) {
clearInterval(reloadTimer);
window.location.reload();
} else {
reloadBtn.textContent = reloadBtnText();
const probeAndReload = async () => {
// Pause 2 seconds initially to allow init scripts and rpcd reload to commence
await new Promise((resolve) => setTimeout(resolve, 2000));
while (isProbing && attempt < maxAttempts) {
attempt += 1;
statusEl.textContent = `${_('Verifying router and service readiness...')} (${attempt}/${maxAttempts})`;
try {
const res = await TachyonShellMethods.getSystemInfo();
if (res && res.success) {
statusEl.textContent = _(
'Services are online and ready! Reloading page...',
);
reloadBtn.textContent = _('Reloading...');
await new Promise((resolve) => setTimeout(resolve, 600));
window.location.reload();
return;
}
} catch (_err) {
// RPC is unavailable while daemon/rpcd is reloading; keep probing
}
await new Promise((resolve) => setTimeout(resolve, 1500));
}
}, 1000);
if (isProbing) {
statusEl.textContent = _(
'Services restarted. Click to reload page.',
);
}
};
void probeAndReload();
} else {
const actionButtons: HTMLElement[] = [];
@@ -409,10 +449,11 @@ export function showUpdateProgressModal(
cleanupTimers();
finishLogTracking();
const bannerEl = E('div', { class: 'tachyon-update-modal__error-banner' }, [
renderXIcon24(),
E('span', {}, errorMessage || _('Operation failed')),
]);
const bannerEl = E(
'div',
{ class: 'tachyon-update-modal__error-banner' },
[renderXIcon24(), E('span', {}, errorMessage || _('Operation failed'))],
);
const closeBtn = renderButton({
classNames: ['cbi-button-remove'],
@@ -424,11 +465,7 @@ export function showUpdateProgressModal(
actionButtonContainer.replaceChildren(
bannerEl,
E(
'div',
{ class: 'tachyon-update-modal__action-buttons' },
[closeBtn],
),
E('div', { class: 'tachyon-update-modal__action-buttons' }, [closeBtn]),
);
},
startLogTracking: (jobId: string) => {
@@ -7320,7 +7320,9 @@ function renderCommonDetailsModal(info, fields, renderMemberName, isPriority, se
_("Active")
]
)
] : isPriority || section.outbounds.some((o) => o.code === member.code) ? [
] : isPriority || section.outbounds.some(
(o) => o.code === member.code
) ? [
E(
"button",
{
@@ -16006,9 +16008,13 @@ function showUpdateProgressModal(options) {
]),
timerBadgeEl
]);
const logPreEl = E("pre", {
class: "tachyon-update-modal__log"
}, _("Operation started. Waiting for log output..."));
const logPreEl = E(
"pre",
{
class: "tachyon-update-modal__log"
},
_("Operation started. Waiting for log output...")
);
const logPanelEl = E("div", { class: "tachyon-update-modal__log-panel" }, [
E("div", { class: "tachyon-update-modal__log-header" }, [
E("b", {}, _("Operation log")),
@@ -16143,37 +16149,65 @@ function showUpdateProgressModal(options) {
cleanupTimers();
finishLogTracking();
const successMsg = message || (isCheckAction ? _("Check completed!") : options.action === "remove" ? _("Removal completed successfully!") : _("Operation completed successfully!"));
const bannerEl = E("div", { class: "tachyon-update-modal__success-banner" }, [
renderCheckIcon24(),
E("span", {}, successMsg)
]);
const bannerEl = E(
"div",
{ class: "tachyon-update-modal__success-banner" },
[renderCheckIcon24(), E("span", {}, successMsg)]
);
if (opts?.reloadPage) {
let secondsLeft = 3;
const reloadBtnText = () => `${_("Reloading page in")} ${secondsLeft}s...`;
let isProbing = true;
let attempt = 0;
const maxAttempts = 30;
const statusEl = E(
"div",
{
class: "tachyon-update-modal__reload-status",
style: "margin: 10px 0; font-size: 0.95em; color: var(--cbi-color-neutral, #666);"
},
_("Waiting for router services to restart...")
);
const reloadBtn = renderButton({
classNames: ["cbi-button-save"],
text: reloadBtnText(),
text: _("Reload now"),
onClick: () => {
isProbing = false;
window.location.reload();
}
});
actionButtonContainer.replaceChildren(
bannerEl,
E(
"div",
{ class: "tachyon-update-modal__action-buttons" },
[reloadBtn]
)
statusEl,
E("div", { class: "tachyon-update-modal__action-buttons" }, [
reloadBtn
])
);
const reloadTimer = setInterval(() => {
secondsLeft -= 1;
if (secondsLeft <= 0) {
clearInterval(reloadTimer);
window.location.reload();
} else {
reloadBtn.textContent = reloadBtnText();
const probeAndReload = async () => {
await new Promise((resolve) => setTimeout(resolve, 2e3));
while (isProbing && attempt < maxAttempts) {
attempt += 1;
statusEl.textContent = `${_("Verifying router and service readiness...")} (${attempt}/${maxAttempts})`;
try {
const res = await TachyonShellMethods.getSystemInfo();
if (res && res.success) {
statusEl.textContent = _(
"Services are online and ready! Reloading page..."
);
reloadBtn.textContent = _("Reloading...");
await new Promise((resolve) => setTimeout(resolve, 600));
window.location.reload();
return;
}
} catch (_err) {
}
await new Promise((resolve) => setTimeout(resolve, 1500));
}
}, 1e3);
if (isProbing) {
statusEl.textContent = _(
"Services restarted. Click to reload page."
);
}
};
void probeAndReload();
} else {
const actionButtons = [];
if (opts?.onInstall) {
@@ -16217,10 +16251,11 @@ function showUpdateProgressModal(options) {
completeError: (errorMessage) => {
cleanupTimers();
finishLogTracking();
const bannerEl = E("div", { class: "tachyon-update-modal__error-banner" }, [
renderXIcon24(),
E("span", {}, errorMessage || _("Operation failed"))
]);
const bannerEl = E(
"div",
{ class: "tachyon-update-modal__error-banner" },
[renderXIcon24(), E("span", {}, errorMessage || _("Operation failed"))]
);
const closeBtn = renderButton({
classNames: ["cbi-button-remove"],
text: _("Close"),
@@ -16230,11 +16265,7 @@ function showUpdateProgressModal(options) {
});
actionButtonContainer.replaceChildren(
bannerEl,
E(
"div",
{ class: "tachyon-update-modal__action-buttons" },
[closeBtn]
)
E("div", { class: "tachyon-update-modal__action-buttons" }, [closeBtn])
);
},
startLogTracking: (jobId) => {
@@ -16761,7 +16792,19 @@ function isComponentActionAlreadyRunningError(message) {
}
function handleComponentUiState(uiState) {
for (const state of uiState.actions.component || []) {
void followComponentActionState(state);
const jobId = state.job_id;
if (!jobId) {
continue;
}
if (handledComponentJobs.has(jobId) || followedComponentJobs.has(jobId)) {
continue;
}
if (state.running) {
void followComponentActionState(state);
} else {
handledComponentJobs.add(jobId);
void ackComponentActionJob(jobId);
}
}
}
async function refreshComponentActionState() {
@@ -16809,15 +16852,18 @@ async function handleComponentAction(button) {
const checkResult = getVisibleCheckResult(button.component);
const currentSha = checkResult?.current_sha;
const targetSha = checkResult?.latest_sha;
const modalController = showUpdateProgressModal({
component: button.component,
action: button.action,
componentTitle: cardTitle,
currentVersion,
targetVersion,
currentSha,
targetSha
});
let modalController = getActiveProgressModalController();
if (!modalController) {
modalController = showUpdateProgressModal({
component: button.component,
action: button.action,
componentTitle: cardTitle,
currentVersion,
targetVersion,
currentSha,
targetSha
});
}
let jobId = "";
let ownsJobFollow = false;
try {
@@ -16859,14 +16905,14 @@ async function handleComponentAction(button) {
throw new Error(startResponse.error);
}
jobId = startResponse.data.job_id;
setActiveProgressModalJobId(jobId);
markUiActionOwned("component", jobId);
modalController.startLogTracking(jobId);
if (followedComponentJobs.has(jobId)) {
if (followedComponentJobs.has(jobId) || handledComponentJobs.has(jobId)) {
return;
}
followedComponentJobs.add(jobId);
ownsJobFollow = true;
setActiveProgressModalJobId(jobId);
markUiActionOwned("component", jobId);
modalController.startLogTracking(jobId);
const response = await TachyonShellMethods.waitComponentActionJob(
jobId,
button.component,
+22 -4
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 20:35+0300\n"
"PO-Revision-Date: 2026-08-16 20:35+0300\n"
"POT-Creation-Date: 2026-08-17 10:26+0300\n"
"PO-Revision-Date: 2026-08-17 10:26+0300\n"
"Last-Translator: Dushnilin\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -2372,8 +2372,11 @@ msgstr "Регулярное выражение не должно содержа
msgid "Reinstall"
msgstr "Переустановить"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Reload now"
msgstr ""
msgid "Reloading..."
msgstr ""
msgid "Remote Hosts Lists"
msgstr "Удалённые списки Hosts"
@@ -2741,9 +2744,15 @@ msgstr "Список сервисов"
msgid "Services & Access"
msgstr "Сервисы и доступ"
msgid "Services are online and ready! Reloading page..."
msgstr ""
msgid "Services info"
msgstr "Информация о сервисах"
msgid "Services restarted. Click to reload page."
msgstr ""
msgid "Settings"
msgstr "Настройки"
@@ -3404,6 +3413,9 @@ msgstr "Значение не может быть пустым"
msgid "Value must not contain control characters"
msgstr "Значение не должно содержать символы управления"
msgid "Verifying router and service readiness..."
msgstr ""
msgid "Via country.is"
msgstr "Через country.is"
@@ -3416,6 +3428,9 @@ msgstr "Видимое имя этой секции"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "Waiting for router services to restart..."
msgstr ""
msgid "WAN"
msgstr "WAN"
@@ -3509,6 +3524,9 @@ msgstr "sing-box outbound для Zapret2 настроен"
msgid "Zapret2 sing-box outbound is not configured"
msgstr "sing-box outbound для Zapret2 не настроен"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Level"
msgstr "Уровень"
+57 -37
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 17:35+0300\n"
"PO-Revision-Date: 2026-08-16 17:35+0300\n"
"POT-Creation-Date: 2026-08-17 07:26+0300\n"
"PO-Revision-Date: 2026-08-17 07:26+0300\n"
"Last-Translator: Dushnilin <dushnilin@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Anonymized support report copied to clipboard"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:844
#: src/tachyon/tabs/updates/initController.ts:861
msgid "Another component action is already running"
msgstr ""
@@ -611,7 +611,7 @@ msgstr ""
msgid "Check timeout after which the server is considered dead"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:913
#: src/tachyon/tabs/updates/initController.ts:930
msgid "Check update"
msgstr ""
@@ -662,14 +662,14 @@ msgstr ""
msgid "checks"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23
#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed"
msgstr ""
@@ -725,8 +725,8 @@ msgstr ""
#: src/tachyon/tabs/monitoring/initController.ts:884
#: src/tachyon/tabs/monitoring/initController.ts:934
#: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451
msgid "Close"
msgstr ""
@@ -1562,7 +1562,7 @@ msgstr ""
#: src/tachyon/tabs/updates/initController.ts:619
#: src/tachyon/tabs/updates/initController.ts:620
#: src/tachyon/tabs/updates/initController.ts:695
#: src/tachyon/tabs/updates/initController.ts:891
#: src/tachyon/tabs/updates/initController.ts:908
msgid "Failed to execute"
msgstr ""
@@ -2043,21 +2043,21 @@ msgstr ""
msgid "Init Packet Payload (I5)"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363
#: src/tachyon/tabs/updates/initController.ts:944
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395
msgid "Install"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1421
#: src/tachyon/tabs/updates/initController.ts:1438
msgid "Install another build:"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1279
#: src/tachyon/tabs/updates/initController.ts:1296
msgid "Installed build → Available build"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:341
#: src/tachyon/tabs/updates/initController.ts:1287
#: src/tachyon/tabs/updates/initController.ts:1304
msgid "Installed version is newer than release"
msgstr ""
@@ -2395,8 +2395,8 @@ msgstr ""
msgid "Issues"
msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected"
msgstr ""
@@ -2490,11 +2490,11 @@ msgid "Latency test URL"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:344
#: src/tachyon/tabs/updates/initController.ts:1285
#: src/tachyon/tabs/updates/initController.ts:1302
msgid "Latest version is installed"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1287
#: src/tachyon/tabs/updates/initController.ts:1304
msgid "Latest version:"
msgstr ""
@@ -2557,11 +2557,11 @@ msgstr ""
msgid "Loading connections"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1129
#: src/tachyon/tabs/updates/initController.ts:1144
#: src/tachyon/tabs/updates/initController.ts:1162
#: src/tachyon/tabs/updates/initController.ts:1176
#: src/tachyon/tabs/updates/initController.ts:1190
#: src/tachyon/tabs/updates/initController.ts:1146
#: src/tachyon/tabs/updates/initController.ts:1161
#: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1207
msgid "Loading..."
msgstr ""
@@ -2879,9 +2879,9 @@ msgstr ""
#: src/tachyon/helpers/singBoxVariant.ts:38
#: src/tachyon/helpers/singBoxVariant.ts:46
#: src/tachyon/tabs/updates/initController.ts:1165
#: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1182
#: src/tachyon/tabs/updates/initController.ts:1196
#: src/tachyon/tabs/updates/initController.ts:1210
msgid "Not installed"
msgstr ""
@@ -2991,8 +2991,8 @@ msgstr ""
msgid "Only the specified servers."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1261
#: src/tachyon/tabs/updates/initController.ts:1300
#: src/tachyon/tabs/updates/initController.ts:1278
#: src/tachyon/tabs/updates/initController.ts:1317
msgid "Open"
msgstr ""
@@ -3008,7 +3008,7 @@ msgstr ""
msgid "Operation completed successfully!"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446
msgid "Operation failed"
msgstr ""
@@ -3356,7 +3356,7 @@ msgstr ""
msgid "Rebuild firewall rules"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1281
#: src/tachyon/tabs/updates/initController.ts:1298
msgid "Rebuilt release"
msgstr ""
@@ -3400,12 +3400,16 @@ msgstr ""
msgid "Regular expression must not contain spaces or commas"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1041
#: src/tachyon/tabs/updates/initController.ts:1058
msgid "Reinstall"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329
msgid "Reloading page in"
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342
msgid "Reload now"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371
msgid "Reloading..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847
@@ -3417,7 +3421,7 @@ msgid "Removal completed successfully!"
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927
#: src/tachyon/tabs/updates/initController.ts:997
#: src/tachyon/tabs/updates/initController.ts:1014
msgid "Remove"
msgstr ""
@@ -3935,10 +3939,18 @@ msgstr ""
msgid "Services & Access"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370
msgid "Services are online and ready! Reloading page..."
msgstr ""
#: src/tachyon/tabs/dashboard/initController.ts:1871
msgid "Services info"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384
msgid "Services restarted. Click to reload page."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232
msgid "Settings"
@@ -4555,7 +4567,7 @@ msgstr ""
msgid "Traffic will go through the default route (Direct/Default)."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:860
#: src/tachyon/tabs/updates/initController.ts:877
msgid "Transient connection error"
msgstr ""
@@ -4725,7 +4737,7 @@ msgstr ""
msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically."
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927
#: src/tachyon/tabs/updates/initController.ts:944
msgid "Update"
msgstr ""
@@ -4733,11 +4745,11 @@ msgstr ""
msgid "Update is available"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1268
#: src/tachyon/tabs/updates/initController.ts:1285
msgid "Update is available for current release"
msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1247
#: src/tachyon/tabs/updates/initController.ts:1264
msgid "Update is available:"
msgstr ""
@@ -4905,6 +4917,10 @@ msgstr ""
msgid "Value must not contain control characters"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365
msgid "Verifying router and service readiness..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986
msgid "Via country.is"
msgstr ""
@@ -4922,6 +4938,10 @@ msgstr ""
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337
msgid "Waiting for router services to restart..."
msgstr ""
#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70
msgid "WAN"
msgstr ""