fix(updates): предотвратить повторные модальные окна и добавить активную проверку готовности сервисов роутера перед перезагрузкой страницы
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 "Уровень"
|
||||
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
Reference in New Issue
Block a user