ysk-server-shared 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (766) hide show
  1. package/README.md +21 -6
  2. package/dist/browser.d.ts +1 -0
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +1 -0
  5. package/dist/browser.js.map +1 -1
  6. package/dist/bt-tracker.d.ts +56 -0
  7. package/dist/bt-tracker.d.ts.map +1 -1
  8. package/dist/bt-tracker.js +1 -0
  9. package/dist/bt-tracker.js.map +1 -1
  10. package/dist/capabilities.d.ts +1 -1
  11. package/dist/capabilities.d.ts.map +1 -1
  12. package/dist/capabilities.js +6 -0
  13. package/dist/capabilities.js.map +1 -1
  14. package/dist/databases.d.ts +2 -0
  15. package/dist/databases.d.ts.map +1 -1
  16. package/dist/docker.d.ts +134 -0
  17. package/dist/docker.d.ts.map +1 -0
  18. package/dist/docker.js +94 -0
  19. package/dist/docker.js.map +1 -0
  20. package/dist/dto.d.ts +9 -0
  21. package/dist/dto.d.ts.map +1 -1
  22. package/dist/email-domain.d.ts +7 -0
  23. package/dist/email-domain.d.ts.map +1 -1
  24. package/dist/files.d.ts +18 -0
  25. package/dist/files.d.ts.map +1 -1
  26. package/dist/files.js +35 -1
  27. package/dist/files.js.map +1 -1
  28. package/dist/ftp.d.ts +3 -0
  29. package/dist/ftp.d.ts.map +1 -1
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/migrate.d.ts +6 -0
  35. package/dist/migrate.d.ts.map +1 -1
  36. package/dist/migrate.js.map +1 -1
  37. package/dist/route-capabilities.d.ts +16 -0
  38. package/dist/route-capabilities.d.ts.map +1 -1
  39. package/dist/route-capabilities.js +132 -4
  40. package/dist/route-capabilities.js.map +1 -1
  41. package/dist/system.d.ts +4 -0
  42. package/dist/system.d.ts.map +1 -1
  43. package/dist/validators.d.ts +141 -0
  44. package/dist/validators.d.ts.map +1 -0
  45. package/dist/validators.js +109 -0
  46. package/dist/validators.js.map +1 -0
  47. package/locales/ar/agents.json +11 -1
  48. package/locales/ar/apache.json +5 -1
  49. package/locales/ar/audit.json +4 -1
  50. package/locales/ar/backups.json +20 -1
  51. package/locales/ar/btTracker.json +118 -39
  52. package/locales/ar/catalog.json +8 -8
  53. package/locales/ar/cdn.json +87 -1
  54. package/locales/ar/cli.json +4 -4
  55. package/locales/ar/common.json +8 -1
  56. package/locales/ar/cron.json +30 -1
  57. package/locales/ar/dashboard.json +21 -2
  58. package/locales/ar/db.json +58 -3
  59. package/locales/ar/dns.json +19 -1
  60. package/locales/ar/docker.json +247 -0
  61. package/locales/ar/email.json +47 -11
  62. package/locales/ar/errors.json +5 -2
  63. package/locales/ar/fail2ban.json +38 -13
  64. package/locales/ar/files.json +52 -10
  65. package/locales/ar/firewall.json +19 -10
  66. package/locales/ar/ftp.json +16 -1
  67. package/locales/ar/hostBrowse.json +35 -15
  68. package/locales/ar/listToolbar.json +2 -1
  69. package/locales/ar/login.json +12 -7
  70. package/locales/ar/logs.json +31 -2
  71. package/locales/ar/metrics.json +36 -1
  72. package/locales/ar/migrate.json +14 -1
  73. package/locales/ar/nav.json +11 -4
  74. package/locales/ar/network.json +25 -2
  75. package/locales/ar/notFound.json +6 -0
  76. package/locales/ar/notes.json +213 -61
  77. package/locales/ar/playbooks.json +1 -1
  78. package/locales/ar/projects.json +132 -11
  79. package/locales/ar/protection.json +70 -8
  80. package/locales/ar/publicFiles.json +14 -1
  81. package/locales/ar/rbac.json +15 -2
  82. package/locales/ar/readiness.json +33 -2
  83. package/locales/ar/redis.json +19 -1
  84. package/locales/ar/runtime.json +49 -2
  85. package/locales/ar/search.json +14 -10
  86. package/locales/ar/security.json +66 -7
  87. package/locales/ar/serviceExposure.json +18 -6
  88. package/locales/ar/services.json +61 -3
  89. package/locales/ar/software.json +2 -1
  90. package/locales/ar/softwareLifecycle.json +12 -2
  91. package/locales/ar/ssl.json +12 -1
  92. package/locales/ar/stackWizard.json +9 -2
  93. package/locales/ar/support.json +33 -17
  94. package/locales/ar/system.json +26 -2
  95. package/locales/ar/systemd.json +3 -1
  96. package/locales/ar/terminal.json +9 -1
  97. package/locales/ar/translation.json +2189 -295
  98. package/locales/ar/updates.json +75 -3
  99. package/locales/ar/users.json +19 -1
  100. package/locales/ar/validators.json +266 -0
  101. package/locales/ar/vnc.json +10 -1
  102. package/locales/ar/vpn.json +18 -3
  103. package/locales/bn/agents.json +11 -1
  104. package/locales/bn/apache.json +5 -1
  105. package/locales/bn/audit.json +4 -1
  106. package/locales/bn/backups.json +20 -1
  107. package/locales/bn/btTracker.json +118 -39
  108. package/locales/bn/catalog.json +5 -5
  109. package/locales/bn/cdn.json +87 -1
  110. package/locales/bn/cli.json +2 -2
  111. package/locales/bn/common.json +8 -1
  112. package/locales/bn/cron.json +30 -1
  113. package/locales/bn/dashboard.json +21 -2
  114. package/locales/bn/db.json +58 -3
  115. package/locales/bn/dns.json +19 -1
  116. package/locales/bn/docker.json +247 -0
  117. package/locales/bn/email.json +46 -10
  118. package/locales/bn/errors.json +5 -2
  119. package/locales/bn/fail2ban.json +26 -1
  120. package/locales/bn/files.json +52 -10
  121. package/locales/bn/firewall.json +17 -8
  122. package/locales/bn/ftp.json +16 -1
  123. package/locales/bn/hostBrowse.json +35 -15
  124. package/locales/bn/listToolbar.json +2 -1
  125. package/locales/bn/login.json +13 -8
  126. package/locales/bn/logs.json +31 -2
  127. package/locales/bn/metrics.json +36 -1
  128. package/locales/bn/migrate.json +14 -1
  129. package/locales/bn/nav.json +10 -3
  130. package/locales/bn/network.json +25 -2
  131. package/locales/bn/notFound.json +6 -0
  132. package/locales/bn/notes.json +183 -31
  133. package/locales/bn/projects.json +131 -10
  134. package/locales/bn/protection.json +64 -2
  135. package/locales/bn/publicFiles.json +14 -1
  136. package/locales/bn/rbac.json +15 -2
  137. package/locales/bn/readiness.json +32 -1
  138. package/locales/bn/redis.json +19 -1
  139. package/locales/bn/runtime.json +49 -2
  140. package/locales/bn/search.json +13 -9
  141. package/locales/bn/security.json +66 -7
  142. package/locales/bn/serviceExposure.json +18 -6
  143. package/locales/bn/services.json +60 -2
  144. package/locales/bn/software.json +2 -1
  145. package/locales/bn/softwareLifecycle.json +12 -2
  146. package/locales/bn/ssl.json +12 -1
  147. package/locales/bn/stackWizard.json +9 -2
  148. package/locales/bn/support.json +38 -22
  149. package/locales/bn/system.json +26 -2
  150. package/locales/bn/systemd.json +3 -1
  151. package/locales/bn/terminal.json +9 -1
  152. package/locales/bn/translation.json +2133 -239
  153. package/locales/bn/updates.json +75 -3
  154. package/locales/bn/users.json +19 -1
  155. package/locales/bn/validators.json +266 -0
  156. package/locales/bn/vnc.json +10 -1
  157. package/locales/bn/vpn.json +18 -3
  158. package/locales/en/agents.json +15 -5
  159. package/locales/en/apache.json +4 -0
  160. package/locales/en/audit.json +4 -1
  161. package/locales/en/backups.json +21 -2
  162. package/locales/en/btTracker.json +82 -3
  163. package/locales/en/cdn.json +102 -2
  164. package/locales/en/cli.json +7 -7
  165. package/locales/en/common.json +8 -1
  166. package/locales/en/cron.json +30 -1
  167. package/locales/en/dashboard.json +25 -6
  168. package/locales/en/db.json +64 -8
  169. package/locales/en/dns.json +19 -1
  170. package/locales/en/docker.json +247 -0
  171. package/locales/en/email.json +47 -11
  172. package/locales/en/errors.json +6 -3
  173. package/locales/en/fail2ban.json +31 -6
  174. package/locales/en/files.json +43 -1
  175. package/locales/en/firewall.json +10 -1
  176. package/locales/en/ftp.json +18 -3
  177. package/locales/en/hostBrowse.json +22 -2
  178. package/locales/en/listToolbar.json +2 -1
  179. package/locales/en/login.json +6 -1
  180. package/locales/en/logs.json +33 -4
  181. package/locales/en/metrics.json +37 -2
  182. package/locales/en/migrate.json +14 -1
  183. package/locales/en/nav.json +9 -2
  184. package/locales/en/network.json +25 -2
  185. package/locales/en/notFound.json +6 -0
  186. package/locales/en/notes.json +190 -38
  187. package/locales/en/projects.json +132 -11
  188. package/locales/en/protection.json +66 -3
  189. package/locales/en/publicFiles.json +14 -1
  190. package/locales/en/rbac.json +15 -2
  191. package/locales/en/readiness.json +30 -1
  192. package/locales/en/redis.json +19 -1
  193. package/locales/en/runtime.json +51 -3
  194. package/locales/en/search.json +4 -0
  195. package/locales/en/security.json +68 -9
  196. package/locales/en/serviceExposure.json +13 -1
  197. package/locales/en/services.json +60 -2
  198. package/locales/en/software.json +2 -1
  199. package/locales/en/softwareLifecycle.json +11 -1
  200. package/locales/en/ssl.json +12 -1
  201. package/locales/en/stackWizard.json +9 -2
  202. package/locales/en/support.json +17 -1
  203. package/locales/en/system.json +30 -6
  204. package/locales/en/systemd.json +2 -0
  205. package/locales/en/terminal.json +10 -2
  206. package/locales/en/translation.json +2074 -180
  207. package/locales/en/updates.json +49 -4
  208. package/locales/en/users.json +20 -1
  209. package/locales/en/validators.json +266 -0
  210. package/locales/en/vnc.json +16 -7
  211. package/locales/en/vpn.json +17 -2
  212. package/locales/es/agents.json +11 -1
  213. package/locales/es/apache.json +5 -1
  214. package/locales/es/audit.json +4 -1
  215. package/locales/es/backups.json +20 -1
  216. package/locales/es/btTracker.json +116 -37
  217. package/locales/es/catalog.json +6 -6
  218. package/locales/es/cdn.json +87 -1
  219. package/locales/es/cli.json +2 -2
  220. package/locales/es/common.json +8 -1
  221. package/locales/es/cron.json +30 -1
  222. package/locales/es/dashboard.json +21 -2
  223. package/locales/es/db.json +58 -3
  224. package/locales/es/dns.json +19 -1
  225. package/locales/es/docker.json +247 -0
  226. package/locales/es/email.json +46 -10
  227. package/locales/es/errors.json +5 -2
  228. package/locales/es/fail2ban.json +26 -1
  229. package/locales/es/files.json +51 -9
  230. package/locales/es/firewall.json +17 -8
  231. package/locales/es/ftp.json +16 -1
  232. package/locales/es/hostBrowse.json +33 -13
  233. package/locales/es/listToolbar.json +2 -1
  234. package/locales/es/login.json +12 -7
  235. package/locales/es/logs.json +31 -2
  236. package/locales/es/metrics.json +36 -1
  237. package/locales/es/migrate.json +14 -1
  238. package/locales/es/nav.json +11 -4
  239. package/locales/es/network.json +25 -2
  240. package/locales/es/notFound.json +6 -0
  241. package/locales/es/notes.json +190 -38
  242. package/locales/es/projects.json +131 -10
  243. package/locales/es/protection.json +64 -2
  244. package/locales/es/publicFiles.json +14 -1
  245. package/locales/es/rbac.json +15 -2
  246. package/locales/es/readiness.json +32 -1
  247. package/locales/es/redis.json +19 -1
  248. package/locales/es/runtime.json +49 -2
  249. package/locales/es/search.json +13 -9
  250. package/locales/es/security.json +66 -7
  251. package/locales/es/serviceExposure.json +18 -6
  252. package/locales/es/services.json +60 -2
  253. package/locales/es/software.json +2 -1
  254. package/locales/es/softwareLifecycle.json +12 -2
  255. package/locales/es/ssl.json +12 -1
  256. package/locales/es/stackWizard.json +9 -2
  257. package/locales/es/support.json +37 -21
  258. package/locales/es/system.json +26 -2
  259. package/locales/es/systemd.json +3 -1
  260. package/locales/es/terminal.json +9 -1
  261. package/locales/es/translation.json +2135 -241
  262. package/locales/es/updates.json +75 -3
  263. package/locales/es/users.json +19 -1
  264. package/locales/es/validators.json +266 -0
  265. package/locales/es/vnc.json +10 -1
  266. package/locales/es/vpn.json +18 -3
  267. package/locales/fr/agents.json +11 -1
  268. package/locales/fr/apache.json +5 -1
  269. package/locales/fr/audit.json +4 -1
  270. package/locales/fr/backups.json +20 -1
  271. package/locales/fr/btTracker.json +115 -36
  272. package/locales/fr/catalog.json +6 -6
  273. package/locales/fr/cdn.json +87 -1
  274. package/locales/fr/cli.json +3 -3
  275. package/locales/fr/common.json +8 -1
  276. package/locales/fr/cron.json +30 -1
  277. package/locales/fr/dashboard.json +21 -2
  278. package/locales/fr/db.json +58 -3
  279. package/locales/fr/dns.json +19 -1
  280. package/locales/fr/docker.json +247 -0
  281. package/locales/fr/email.json +44 -8
  282. package/locales/fr/errors.json +5 -2
  283. package/locales/fr/fail2ban.json +27 -2
  284. package/locales/fr/files.json +51 -9
  285. package/locales/fr/firewall.json +13 -4
  286. package/locales/fr/ftp.json +16 -1
  287. package/locales/fr/hostBrowse.json +32 -12
  288. package/locales/fr/listToolbar.json +2 -1
  289. package/locales/fr/login.json +11 -6
  290. package/locales/fr/logs.json +31 -2
  291. package/locales/fr/metrics.json +36 -1
  292. package/locales/fr/migrate.json +14 -1
  293. package/locales/fr/nav.json +11 -4
  294. package/locales/fr/network.json +25 -2
  295. package/locales/fr/notFound.json +6 -0
  296. package/locales/fr/notes.json +186 -34
  297. package/locales/fr/projects.json +129 -8
  298. package/locales/fr/protection.json +64 -2
  299. package/locales/fr/publicFiles.json +14 -1
  300. package/locales/fr/rbac.json +15 -2
  301. package/locales/fr/readiness.json +32 -1
  302. package/locales/fr/redis.json +20 -2
  303. package/locales/fr/runtime.json +49 -2
  304. package/locales/fr/search.json +11 -7
  305. package/locales/fr/security.json +66 -7
  306. package/locales/fr/serviceExposure.json +17 -5
  307. package/locales/fr/services.json +60 -2
  308. package/locales/fr/software.json +2 -1
  309. package/locales/fr/softwareLifecycle.json +12 -2
  310. package/locales/fr/ssl.json +12 -1
  311. package/locales/fr/stackWizard.json +9 -2
  312. package/locales/fr/support.json +37 -21
  313. package/locales/fr/system.json +26 -2
  314. package/locales/fr/systemd.json +3 -1
  315. package/locales/fr/terminal.json +9 -1
  316. package/locales/fr/translation.json +2119 -225
  317. package/locales/fr/updates.json +75 -3
  318. package/locales/fr/users.json +19 -1
  319. package/locales/fr/validators.json +266 -0
  320. package/locales/fr/vnc.json +10 -1
  321. package/locales/fr/vpn.json +17 -2
  322. package/locales/hi/agents.json +11 -1
  323. package/locales/hi/apache.json +5 -1
  324. package/locales/hi/audit.json +4 -1
  325. package/locales/hi/backups.json +20 -1
  326. package/locales/hi/btTracker.json +118 -39
  327. package/locales/hi/catalog.json +7 -7
  328. package/locales/hi/cdn.json +87 -1
  329. package/locales/hi/cli.json +1 -1
  330. package/locales/hi/common.json +8 -1
  331. package/locales/hi/cron.json +30 -1
  332. package/locales/hi/dashboard.json +21 -2
  333. package/locales/hi/db.json +58 -3
  334. package/locales/hi/dns.json +19 -1
  335. package/locales/hi/docker.json +247 -0
  336. package/locales/hi/email.json +46 -10
  337. package/locales/hi/errors.json +5 -2
  338. package/locales/hi/fail2ban.json +29 -4
  339. package/locales/hi/files.json +52 -10
  340. package/locales/hi/firewall.json +17 -8
  341. package/locales/hi/ftp.json +16 -1
  342. package/locales/hi/hostBrowse.json +35 -15
  343. package/locales/hi/listToolbar.json +2 -1
  344. package/locales/hi/login.json +13 -8
  345. package/locales/hi/logs.json +31 -2
  346. package/locales/hi/metrics.json +36 -1
  347. package/locales/hi/migrate.json +14 -1
  348. package/locales/hi/nav.json +11 -4
  349. package/locales/hi/network.json +25 -2
  350. package/locales/hi/notFound.json +6 -0
  351. package/locales/hi/notes.json +188 -36
  352. package/locales/hi/projects.json +132 -11
  353. package/locales/hi/protection.json +65 -3
  354. package/locales/hi/publicFiles.json +14 -1
  355. package/locales/hi/rbac.json +16 -3
  356. package/locales/hi/readiness.json +32 -1
  357. package/locales/hi/redis.json +19 -1
  358. package/locales/hi/runtime.json +49 -2
  359. package/locales/hi/search.json +14 -10
  360. package/locales/hi/security.json +66 -7
  361. package/locales/hi/serviceExposure.json +18 -6
  362. package/locales/hi/services.json +60 -2
  363. package/locales/hi/software.json +2 -1
  364. package/locales/hi/softwareLifecycle.json +12 -2
  365. package/locales/hi/ssl.json +12 -1
  366. package/locales/hi/stackWizard.json +9 -2
  367. package/locales/hi/support.json +36 -20
  368. package/locales/hi/system.json +26 -2
  369. package/locales/hi/systemd.json +3 -1
  370. package/locales/hi/terminal.json +9 -1
  371. package/locales/hi/translation.json +2146 -252
  372. package/locales/hi/updates.json +75 -3
  373. package/locales/hi/users.json +19 -1
  374. package/locales/hi/validators.json +266 -0
  375. package/locales/hi/vnc.json +10 -1
  376. package/locales/hi/vpn.json +19 -4
  377. package/locales/id/agents.json +11 -1
  378. package/locales/id/apache.json +5 -1
  379. package/locales/id/audit.json +4 -1
  380. package/locales/id/backups.json +20 -1
  381. package/locales/id/btTracker.json +116 -37
  382. package/locales/id/catalog.json +6 -6
  383. package/locales/id/cdn.json +87 -1
  384. package/locales/id/cli.json +2 -2
  385. package/locales/id/common.json +8 -1
  386. package/locales/id/cron.json +30 -1
  387. package/locales/id/dashboard.json +21 -2
  388. package/locales/id/db.json +58 -3
  389. package/locales/id/dns.json +19 -1
  390. package/locales/id/docker.json +247 -0
  391. package/locales/id/email.json +46 -10
  392. package/locales/id/errors.json +5 -2
  393. package/locales/id/fail2ban.json +26 -1
  394. package/locales/id/files.json +51 -9
  395. package/locales/id/firewall.json +15 -6
  396. package/locales/id/ftp.json +16 -1
  397. package/locales/id/hostBrowse.json +33 -13
  398. package/locales/id/listToolbar.json +2 -1
  399. package/locales/id/login.json +13 -8
  400. package/locales/id/logs.json +31 -2
  401. package/locales/id/metrics.json +36 -1
  402. package/locales/id/migrate.json +14 -1
  403. package/locales/id/nav.json +10 -3
  404. package/locales/id/network.json +25 -2
  405. package/locales/id/notFound.json +6 -0
  406. package/locales/id/notes.json +185 -33
  407. package/locales/id/projects.json +130 -9
  408. package/locales/id/protection.json +64 -2
  409. package/locales/id/publicFiles.json +14 -1
  410. package/locales/id/rbac.json +15 -2
  411. package/locales/id/readiness.json +32 -1
  412. package/locales/id/redis.json +19 -1
  413. package/locales/id/runtime.json +49 -2
  414. package/locales/id/search.json +13 -9
  415. package/locales/id/security.json +65 -6
  416. package/locales/id/serviceExposure.json +18 -6
  417. package/locales/id/services.json +60 -2
  418. package/locales/id/software.json +2 -1
  419. package/locales/id/softwareLifecycle.json +12 -2
  420. package/locales/id/ssl.json +12 -1
  421. package/locales/id/stackWizard.json +9 -2
  422. package/locales/id/support.json +36 -20
  423. package/locales/id/system.json +26 -2
  424. package/locales/id/systemd.json +3 -1
  425. package/locales/id/terminal.json +9 -1
  426. package/locales/id/translation.json +2125 -231
  427. package/locales/id/updates.json +75 -3
  428. package/locales/id/users.json +19 -1
  429. package/locales/id/validators.json +266 -0
  430. package/locales/id/vnc.json +10 -1
  431. package/locales/id/vpn.json +18 -3
  432. package/locales/ja/agents.json +11 -1
  433. package/locales/ja/apache.json +5 -1
  434. package/locales/ja/audit.json +4 -1
  435. package/locales/ja/backups.json +20 -1
  436. package/locales/ja/btTracker.json +118 -39
  437. package/locales/ja/catalog.json +10 -10
  438. package/locales/ja/cdn.json +87 -1
  439. package/locales/ja/cli.json +3 -3
  440. package/locales/ja/common.json +8 -1
  441. package/locales/ja/cron.json +30 -1
  442. package/locales/ja/dashboard.json +21 -2
  443. package/locales/ja/db.json +58 -3
  444. package/locales/ja/dns.json +19 -1
  445. package/locales/ja/docker.json +247 -0
  446. package/locales/ja/email.json +46 -10
  447. package/locales/ja/errors.json +5 -2
  448. package/locales/ja/fail2ban.json +26 -1
  449. package/locales/ja/files.json +51 -9
  450. package/locales/ja/firewall.json +17 -8
  451. package/locales/ja/ftp.json +16 -1
  452. package/locales/ja/hostBrowse.json +35 -15
  453. package/locales/ja/listToolbar.json +2 -1
  454. package/locales/ja/login.json +11 -6
  455. package/locales/ja/logs.json +31 -2
  456. package/locales/ja/metrics.json +36 -1
  457. package/locales/ja/migrate.json +14 -1
  458. package/locales/ja/nav.json +13 -6
  459. package/locales/ja/network.json +26 -3
  460. package/locales/ja/notFound.json +6 -0
  461. package/locales/ja/notes.json +194 -42
  462. package/locales/ja/projects.json +131 -10
  463. package/locales/ja/protection.json +64 -2
  464. package/locales/ja/publicFiles.json +14 -1
  465. package/locales/ja/rbac.json +15 -2
  466. package/locales/ja/readiness.json +32 -1
  467. package/locales/ja/redis.json +19 -1
  468. package/locales/ja/runtime.json +50 -3
  469. package/locales/ja/search.json +12 -8
  470. package/locales/ja/security.json +66 -7
  471. package/locales/ja/serviceExposure.json +18 -6
  472. package/locales/ja/services.json +60 -2
  473. package/locales/ja/software.json +2 -1
  474. package/locales/ja/softwareLifecycle.json +12 -2
  475. package/locales/ja/ssl.json +12 -1
  476. package/locales/ja/stackWizard.json +9 -2
  477. package/locales/ja/support.json +38 -22
  478. package/locales/ja/system.json +26 -2
  479. package/locales/ja/systemd.json +3 -1
  480. package/locales/ja/terminal.json +9 -1
  481. package/locales/ja/translation.json +2152 -258
  482. package/locales/ja/updates.json +75 -3
  483. package/locales/ja/users.json +19 -1
  484. package/locales/ja/validators.json +266 -0
  485. package/locales/ja/vnc.json +10 -1
  486. package/locales/ja/vpn.json +18 -3
  487. package/locales/ko/agents.json +11 -1
  488. package/locales/ko/apache.json +5 -1
  489. package/locales/ko/audit.json +4 -1
  490. package/locales/ko/backups.json +20 -1
  491. package/locales/ko/btTracker.json +118 -39
  492. package/locales/ko/catalog.json +8 -8
  493. package/locales/ko/cdn.json +87 -1
  494. package/locales/ko/cli.json +2 -2
  495. package/locales/ko/common.json +8 -1
  496. package/locales/ko/cron.json +30 -1
  497. package/locales/ko/dashboard.json +21 -2
  498. package/locales/ko/db.json +58 -3
  499. package/locales/ko/dns.json +19 -1
  500. package/locales/ko/docker.json +247 -0
  501. package/locales/ko/email.json +46 -10
  502. package/locales/ko/errors.json +5 -2
  503. package/locales/ko/fail2ban.json +37 -12
  504. package/locales/ko/files.json +51 -9
  505. package/locales/ko/firewall.json +18 -9
  506. package/locales/ko/ftp.json +16 -1
  507. package/locales/ko/hostBrowse.json +35 -15
  508. package/locales/ko/listToolbar.json +2 -1
  509. package/locales/ko/login.json +10 -5
  510. package/locales/ko/logs.json +31 -2
  511. package/locales/ko/metrics.json +36 -1
  512. package/locales/ko/migrate.json +14 -1
  513. package/locales/ko/nav.json +11 -4
  514. package/locales/ko/network.json +25 -2
  515. package/locales/ko/notFound.json +6 -0
  516. package/locales/ko/notes.json +204 -52
  517. package/locales/ko/playbooks.json +1 -1
  518. package/locales/ko/projects.json +132 -11
  519. package/locales/ko/protection.json +67 -5
  520. package/locales/ko/publicFiles.json +14 -1
  521. package/locales/ko/rbac.json +15 -2
  522. package/locales/ko/readiness.json +33 -2
  523. package/locales/ko/redis.json +19 -1
  524. package/locales/ko/runtime.json +49 -2
  525. package/locales/ko/search.json +13 -9
  526. package/locales/ko/security.json +66 -7
  527. package/locales/ko/serviceExposure.json +18 -6
  528. package/locales/ko/services.json +60 -2
  529. package/locales/ko/software.json +2 -1
  530. package/locales/ko/softwareLifecycle.json +12 -2
  531. package/locales/ko/ssl.json +12 -1
  532. package/locales/ko/stackWizard.json +9 -2
  533. package/locales/ko/support.json +36 -20
  534. package/locales/ko/system.json +26 -2
  535. package/locales/ko/systemd.json +3 -1
  536. package/locales/ko/terminal.json +9 -1
  537. package/locales/ko/translation.json +2171 -277
  538. package/locales/ko/updates.json +75 -3
  539. package/locales/ko/users.json +19 -1
  540. package/locales/ko/validators.json +266 -0
  541. package/locales/ko/vnc.json +10 -1
  542. package/locales/ko/vpn.json +19 -4
  543. package/locales/pt/agents.json +11 -1
  544. package/locales/pt/apache.json +5 -1
  545. package/locales/pt/audit.json +4 -1
  546. package/locales/pt/backups.json +20 -1
  547. package/locales/pt/btTracker.json +116 -37
  548. package/locales/pt/catalog.json +4 -4
  549. package/locales/pt/cdn.json +87 -1
  550. package/locales/pt/cli.json +2 -2
  551. package/locales/pt/common.json +8 -1
  552. package/locales/pt/cron.json +30 -1
  553. package/locales/pt/dashboard.json +21 -2
  554. package/locales/pt/db.json +58 -3
  555. package/locales/pt/dns.json +19 -1
  556. package/locales/pt/docker.json +247 -0
  557. package/locales/pt/email.json +46 -10
  558. package/locales/pt/errors.json +5 -2
  559. package/locales/pt/fail2ban.json +26 -1
  560. package/locales/pt/files.json +51 -9
  561. package/locales/pt/firewall.json +16 -7
  562. package/locales/pt/ftp.json +16 -1
  563. package/locales/pt/hostBrowse.json +35 -15
  564. package/locales/pt/listToolbar.json +2 -1
  565. package/locales/pt/login.json +14 -9
  566. package/locales/pt/logs.json +31 -2
  567. package/locales/pt/metrics.json +36 -1
  568. package/locales/pt/migrate.json +14 -1
  569. package/locales/pt/nav.json +10 -3
  570. package/locales/pt/network.json +25 -2
  571. package/locales/pt/notFound.json +6 -0
  572. package/locales/pt/notes.json +187 -35
  573. package/locales/pt/projects.json +129 -8
  574. package/locales/pt/protection.json +64 -2
  575. package/locales/pt/publicFiles.json +14 -1
  576. package/locales/pt/rbac.json +15 -2
  577. package/locales/pt/readiness.json +32 -1
  578. package/locales/pt/redis.json +19 -1
  579. package/locales/pt/runtime.json +49 -2
  580. package/locales/pt/search.json +11 -7
  581. package/locales/pt/security.json +66 -7
  582. package/locales/pt/serviceExposure.json +17 -5
  583. package/locales/pt/services.json +60 -2
  584. package/locales/pt/software.json +2 -1
  585. package/locales/pt/softwareLifecycle.json +12 -2
  586. package/locales/pt/ssl.json +12 -1
  587. package/locales/pt/stackWizard.json +9 -2
  588. package/locales/pt/support.json +36 -20
  589. package/locales/pt/system.json +26 -2
  590. package/locales/pt/systemd.json +3 -1
  591. package/locales/pt/terminal.json +9 -1
  592. package/locales/pt/translation.json +2125 -231
  593. package/locales/pt/updates.json +75 -3
  594. package/locales/pt/users.json +19 -1
  595. package/locales/pt/validators.json +266 -0
  596. package/locales/pt/vnc.json +10 -1
  597. package/locales/pt/vpn.json +17 -2
  598. package/locales/ur/agents.json +11 -1
  599. package/locales/ur/apache.json +5 -1
  600. package/locales/ur/audit.json +4 -1
  601. package/locales/ur/backups.json +20 -1
  602. package/locales/ur/btTracker.json +118 -39
  603. package/locales/ur/catalog.json +6 -6
  604. package/locales/ur/cdn.json +87 -1
  605. package/locales/ur/cli.json +2 -2
  606. package/locales/ur/common.json +8 -1
  607. package/locales/ur/cron.json +30 -1
  608. package/locales/ur/dashboard.json +21 -2
  609. package/locales/ur/db.json +58 -3
  610. package/locales/ur/dns.json +19 -1
  611. package/locales/ur/docker.json +247 -0
  612. package/locales/ur/email.json +46 -10
  613. package/locales/ur/errors.json +5 -2
  614. package/locales/ur/fail2ban.json +26 -1
  615. package/locales/ur/files.json +52 -10
  616. package/locales/ur/firewall.json +17 -8
  617. package/locales/ur/ftp.json +16 -1
  618. package/locales/ur/hostBrowse.json +35 -15
  619. package/locales/ur/listToolbar.json +2 -1
  620. package/locales/ur/login.json +13 -8
  621. package/locales/ur/logs.json +31 -2
  622. package/locales/ur/metrics.json +36 -1
  623. package/locales/ur/migrate.json +14 -1
  624. package/locales/ur/nav.json +10 -3
  625. package/locales/ur/network.json +25 -2
  626. package/locales/ur/notFound.json +6 -0
  627. package/locales/ur/notes.json +183 -31
  628. package/locales/ur/projects.json +131 -10
  629. package/locales/ur/protection.json +64 -2
  630. package/locales/ur/publicFiles.json +14 -1
  631. package/locales/ur/rbac.json +15 -2
  632. package/locales/ur/readiness.json +32 -1
  633. package/locales/ur/redis.json +19 -1
  634. package/locales/ur/runtime.json +49 -2
  635. package/locales/ur/search.json +13 -9
  636. package/locales/ur/security.json +66 -7
  637. package/locales/ur/serviceExposure.json +18 -6
  638. package/locales/ur/services.json +60 -2
  639. package/locales/ur/software.json +2 -1
  640. package/locales/ur/softwareLifecycle.json +12 -2
  641. package/locales/ur/ssl.json +12 -1
  642. package/locales/ur/stackWizard.json +9 -2
  643. package/locales/ur/support.json +37 -21
  644. package/locales/ur/system.json +26 -2
  645. package/locales/ur/systemd.json +3 -1
  646. package/locales/ur/terminal.json +9 -1
  647. package/locales/ur/translation.json +2134 -240
  648. package/locales/ur/updates.json +75 -3
  649. package/locales/ur/users.json +19 -1
  650. package/locales/ur/validators.json +266 -0
  651. package/locales/ur/vnc.json +10 -1
  652. package/locales/ur/vpn.json +19 -4
  653. package/locales/zh-CN/agents.json +11 -1
  654. package/locales/zh-CN/apache.json +6 -2
  655. package/locales/zh-CN/audit.json +4 -1
  656. package/locales/zh-CN/backups.json +20 -1
  657. package/locales/zh-CN/btTracker.json +82 -3
  658. package/locales/zh-CN/catalog.json +2 -2
  659. package/locales/zh-CN/cdn.json +87 -1
  660. package/locales/zh-CN/cli.json +5 -5
  661. package/locales/zh-CN/common.json +8 -1
  662. package/locales/zh-CN/cron.json +30 -1
  663. package/locales/zh-CN/dashboard.json +22 -3
  664. package/locales/zh-CN/db.json +59 -4
  665. package/locales/zh-CN/dns.json +19 -1
  666. package/locales/zh-CN/docker.json +247 -0
  667. package/locales/zh-CN/email.json +46 -10
  668. package/locales/zh-CN/errors.json +5 -2
  669. package/locales/zh-CN/fail2ban.json +31 -6
  670. package/locales/zh-CN/files.json +45 -3
  671. package/locales/zh-CN/firewall.json +11 -2
  672. package/locales/zh-CN/ftp.json +16 -1
  673. package/locales/zh-CN/hostBrowse.json +21 -1
  674. package/locales/zh-CN/listToolbar.json +2 -1
  675. package/locales/zh-CN/login.json +6 -1
  676. package/locales/zh-CN/logs.json +36 -7
  677. package/locales/zh-CN/metrics.json +36 -1
  678. package/locales/zh-CN/migrate.json +14 -1
  679. package/locales/zh-CN/nav.json +10 -3
  680. package/locales/zh-CN/network.json +26 -3
  681. package/locales/zh-CN/nginx.json +1 -1
  682. package/locales/zh-CN/notFound.json +6 -0
  683. package/locales/zh-CN/notes.json +177 -25
  684. package/locales/zh-CN/projects.json +128 -7
  685. package/locales/zh-CN/protection.json +64 -2
  686. package/locales/zh-CN/publicFiles.json +14 -1
  687. package/locales/zh-CN/rbac.json +15 -2
  688. package/locales/zh-CN/readiness.json +33 -2
  689. package/locales/zh-CN/redis.json +19 -1
  690. package/locales/zh-CN/runtime.json +50 -3
  691. package/locales/zh-CN/search.json +5 -1
  692. package/locales/zh-CN/security.json +66 -7
  693. package/locales/zh-CN/serviceExposure.json +13 -1
  694. package/locales/zh-CN/services.json +60 -2
  695. package/locales/zh-CN/software.json +2 -1
  696. package/locales/zh-CN/softwareLifecycle.json +12 -2
  697. package/locales/zh-CN/ssl.json +12 -1
  698. package/locales/zh-CN/stackWizard.json +9 -2
  699. package/locales/zh-CN/support.json +18 -2
  700. package/locales/zh-CN/system.json +27 -3
  701. package/locales/zh-CN/systemd.json +3 -1
  702. package/locales/zh-CN/terminal.json +9 -1
  703. package/locales/zh-CN/translation.json +2040 -146
  704. package/locales/zh-CN/updates.json +75 -3
  705. package/locales/zh-CN/users.json +19 -1
  706. package/locales/zh-CN/validators.json +266 -0
  707. package/locales/zh-CN/vnc.json +10 -1
  708. package/locales/zh-CN/vpn.json +19 -4
  709. package/locales/zh-HK/agents.json +17 -7
  710. package/locales/zh-HK/apache.json +6 -2
  711. package/locales/zh-HK/audit.json +4 -1
  712. package/locales/zh-HK/backups.json +21 -2
  713. package/locales/zh-HK/btTracker.json +86 -7
  714. package/locales/zh-HK/catalog.json +2 -2
  715. package/locales/zh-HK/cdn.json +89 -3
  716. package/locales/zh-HK/cli.json +15 -15
  717. package/locales/zh-HK/common.json +8 -1
  718. package/locales/zh-HK/cron.json +34 -5
  719. package/locales/zh-HK/dashboard.json +25 -6
  720. package/locales/zh-HK/db.json +65 -10
  721. package/locales/zh-HK/dns.json +19 -1
  722. package/locales/zh-HK/docker.json +247 -0
  723. package/locales/zh-HK/email.json +61 -25
  724. package/locales/zh-HK/errors.json +6 -3
  725. package/locales/zh-HK/fail2ban.json +32 -7
  726. package/locales/zh-HK/files.json +47 -5
  727. package/locales/zh-HK/firewall.json +13 -4
  728. package/locales/zh-HK/ftp.json +18 -3
  729. package/locales/zh-HK/hostBrowse.json +22 -2
  730. package/locales/zh-HK/listToolbar.json +2 -1
  731. package/locales/zh-HK/login.json +7 -2
  732. package/locales/zh-HK/logs.json +40 -11
  733. package/locales/zh-HK/metrics.json +38 -3
  734. package/locales/zh-HK/migrate.json +13 -0
  735. package/locales/zh-HK/nav.json +12 -5
  736. package/locales/zh-HK/network.json +30 -7
  737. package/locales/zh-HK/nginx.json +2 -2
  738. package/locales/zh-HK/notFound.json +6 -0
  739. package/locales/zh-HK/notes.json +228 -76
  740. package/locales/zh-HK/projects.json +142 -21
  741. package/locales/zh-HK/protection.json +65 -3
  742. package/locales/zh-HK/publicFiles.json +16 -3
  743. package/locales/zh-HK/rbac.json +15 -2
  744. package/locales/zh-HK/readiness.json +35 -4
  745. package/locales/zh-HK/redis.json +22 -4
  746. package/locales/zh-HK/runtime.json +58 -11
  747. package/locales/zh-HK/search.json +5 -1
  748. package/locales/zh-HK/security.json +77 -18
  749. package/locales/zh-HK/serviceExposure.json +13 -1
  750. package/locales/zh-HK/services.json +61 -3
  751. package/locales/zh-HK/software.json +2 -1
  752. package/locales/zh-HK/softwareLifecycle.json +12 -2
  753. package/locales/zh-HK/ssl.json +13 -2
  754. package/locales/zh-HK/stackWizard.json +10 -3
  755. package/locales/zh-HK/support.json +22 -6
  756. package/locales/zh-HK/system.json +30 -6
  757. package/locales/zh-HK/systemd.json +9 -7
  758. package/locales/zh-HK/terminal.json +10 -2
  759. package/locales/zh-HK/translation.json +2238 -344
  760. package/locales/zh-HK/uiInline.json +3 -3
  761. package/locales/zh-HK/updates.json +76 -4
  762. package/locales/zh-HK/users.json +20 -2
  763. package/locales/zh-HK/validators.json +266 -0
  764. package/locales/zh-HK/vnc.json +16 -7
  765. package/locales/zh-HK/vpn.json +23 -8
  766. package/package.json +1 -1
@@ -26,9 +26,10 @@
26
26
  "fleet": "Fleet",
27
27
  "aiTasks": "AI tasks",
28
28
  "expBanner": "Experimental.",
29
- "expBody": "Registration ≠ online. Real ops use CLI:",
30
- "expDocs": "Docs: repo",
31
- "expPayload": "; command payload recommendation",
29
+ "expBody": "Registration ≠ online. Real ops use the CLI:",
30
+ "expDocs": "Repository file:",
31
+ "expEdge": "On an edge:",
32
+ "expPayload": "Command payload example:",
32
33
  "fleetCan": "What the fleet can do",
33
34
  "fleetCanDesc": "Not a hollow list — real control-plane capabilities for edge nodes",
34
35
  "capRegister": "Register",
@@ -40,7 +41,14 @@
40
41
  "capDelete": "Delete",
41
42
  "capDeleteD": "Removes session and related messages",
42
43
  "capStatus": "Status",
43
- "capStatusD": "Registered only → online (heartbeat) → stale (>60s without heartbeat)",
44
+ "capStatusD": "Registered only → online (heartbeat) → stale (>60s without heartbeat) → offline (disconnected / no further heartbeat)",
45
+ "statusFlowTitle": "Status flow",
46
+ "statusFlow": "Registered only → online → stale (>60s) → offline (disconnected). Filter “Offline” is disconnected.",
47
+ "colSession": "Session UUID",
48
+ "copySession": "Copy session UUID for cluster / CLI --session",
49
+ "staleFor": "Unseen {{age}}",
50
+ "commandTitle": "Queue a command for this session",
51
+ "historyTitleShort": "Open command history (read-only)",
44
52
  "fleetTitle": "Fleet ({{count}})",
45
53
  "fleetDesc": "Control-plane registry · registered ≠ node online",
46
54
  "registerPlus": "+ Register agent",
@@ -130,7 +138,9 @@
130
138
  "labelStderr": "stderr",
131
139
  "labelAckCli": "ack + CLI JSON",
132
140
  "labelStdoutBody": "CLI stdout body",
133
- "resultOuterHint": "Outer result is CLI --json stdout."
141
+ "resultOuterHint": "Outer result is CLI --json stdout.",
142
+ "noteAllowlist": "Agent tool calls must pass the allowlist.",
143
+ "noteRbacCap": "Agent role is capped at write-low."
134
144
  },
135
145
  "ai": {
136
146
  "status": {
@@ -213,6 +223,8 @@
213
223
  "sourceProject": "Project",
214
224
  "sourceStandalone": "Standalone",
215
225
  "sourceArtifact": "On disk",
226
+ "sourceOrphan": "Leftover",
227
+ "orphanSite": "Project gone",
216
228
  "openProject": "Open project",
217
229
  "kindLabel": "Type",
218
230
  "kindProxy": "Proxy",
@@ -221,6 +233,7 @@
221
233
  "upstreamLabel": "Upstream",
222
234
  "rootLabel": "Document root",
223
235
  "sslLabel": "SSL",
236
+ "sslTerminatedUpstream": "TLS ends at front Nginx",
224
237
  "apply": "Apply",
225
238
  "notInstalled": "Apache not installed",
226
239
  "globalSettings": "Global settings",
@@ -244,6 +257,7 @@
244
257
  "removeArtifact": "Remove residual",
245
258
  "removeArtifactTitle": "Remove residual conf?",
246
259
  "removeArtifactDesc": "Delete this unclaimed Apache conf from the panel data directory and disable the system twin when possible. Does not delete the project.",
260
+ "removeArtifactHint": "Deletes this leftover disk conf. Does not delete the project.",
247
261
  "previewConf": "Preview conf",
248
262
  "cleanupConflicts": "Clean conflict residuals",
249
263
  "cleanupConflictsTitle": "Clean all conflict residuals?",
@@ -285,7 +299,10 @@
285
299
  "project.publish": "Publish Nginx",
286
300
  "project.suspend": "Suspend project",
287
301
  "software.install": "Install software",
288
- "software.update": "Update software"
302
+ "software.update": "Update software",
303
+ "backup.restore": "Backup restore",
304
+ "backup.run": "Backup run",
305
+ "backup.delete": "Backup deleted"
289
306
  }
290
307
  },
291
308
  "backups": {
@@ -304,6 +321,7 @@
304
321
  "backupFiles": "Backup files",
305
322
  "projects": "Projects",
306
323
  "lastAll": "Last all",
324
+ "latestFile": "Latest archive",
307
325
  "remote": "Remote",
308
326
  "withBackups": "Projects with backups",
309
327
  "ops": "Actions",
@@ -317,6 +335,10 @@
317
335
  "preview": "Preview",
318
336
  "restoreWeb": "Restore web",
319
337
  "restoreFull": "Full restore",
338
+ "restoreFullTitle": "Overwrite project files and databases from this archive — type the file name to confirm",
339
+ "restoreWebTitle": "Restore website files only from this archive",
340
+ "previewTitle": "Preview restore without writing",
341
+ "partialSkipped": "Partial — some projects skipped",
320
342
  "delete": "Delete",
321
343
  "opsTitle": "Actions",
322
344
  "opsHint": "0 projects or all skipped = success;",
@@ -371,6 +393,7 @@
371
393
  "endpointOptional": "Endpoint (optional)",
372
394
  "localMirror": "Local mirror path",
373
395
  "remotePath": "Remote path",
396
+ "remotePathHint": "Relative to the remote user’s home (or SFTP chroot). “.” is that home.",
374
397
  "resticTitle": "Restic incremental",
375
398
  "resticDesc": "Optional; restic on PATH. Password required when enabled (no default)",
376
399
  "enableRestic": "Enable restic",
@@ -410,7 +433,7 @@
410
433
  "resticOverwriteDone": "restic overwrite home complete",
411
434
  "opsResult": "Ops result",
412
435
  "filesTitle": "Backup files ({{count}})",
413
- "filesSub": "Management-dir tar · download needs login · restore: dry-run / web / full",
436
+ "filesSub": "Archives live in the panel data directory. Download needs a login. Restore can preview, restore the site only, or restore everything.",
414
437
  "backupAllBtn": "Backup all",
415
438
  "yes": "Yes",
416
439
  "no": "No",
@@ -419,7 +442,20 @@
419
442
  "remotePushSub": "After local tar succeeds, push to SFTP, local path, or S3",
420
443
  "accessKey": "Access Key",
421
444
  "secretKey": "Secret Key",
422
- "overwriteConfirmHint": "Type OVERWRITE to confirm overwrite"
445
+ "overwriteConfirmHint": "Type OVERWRITE to confirm overwrite",
446
+ "testRemote": "Test destination",
447
+ "testRemoteHint": "Connects to the remote host and writes a small probe file. Not read-only.",
448
+ "testRemoteDone": "Remote probe finished",
449
+ "testRemoteFailed": "Remote probe failed",
450
+ "resticRepoPh": "Panel data directory / restic-repo",
451
+ "testDisabledHint": "Turn on remote push before testing.",
452
+ "identityId": "Outbound SSH identity",
453
+ "identityHint": "Preferred. Same vault as /security SSH. Password needs sshpass.",
454
+ "identityNone": "None — password or default key",
455
+ "skippedListHint": "These projects were skipped:",
456
+ "skippedPendingOs": "Skipped — OS user / home not provisioned",
457
+ "goLogs": "Open logs",
458
+ "goAbout": "Backup notes"
423
459
  },
424
460
  "btTracker": {
425
461
  "title": "BT Tracker",
@@ -431,11 +467,19 @@
431
467
  "installed": "Installed",
432
468
  "start": "Start",
433
469
  "stop": "Stop",
470
+ "stopTitle": "Stop the tracker — seeding and downloads will interrupt",
471
+ "stopDesc": "Running torrents stop announcing. Peers disconnect until you start the tracker again.",
472
+ "fillPublicHost": "Use {{host}}",
473
+ "fillPublicHostTitle": "Fill the current panel hostname as the public announce host",
434
474
  "refresh": "Refresh",
435
475
  "settings": "Settings",
436
476
  "httpPort": "HTTP / WS port",
437
477
  "udpPort": "UDP port",
438
478
  "listenHost": "Listen",
479
+ "listenHostHint": "0.0.0.0 listens on every address. Prefer 127.0.0.1 unless peers must reach this host.",
480
+ "listenAllWarn": "Tracker is bound to all addresses. With the firewall off this is public. Bind 127.0.0.1 for local-only, or restrict the port in the firewall.",
481
+ "bindLoopback": "127.0.0.1 only",
482
+ "bindAll": "0.0.0.0 (all)",
439
483
  "wsEnabled": "WebSocket",
440
484
  "wsEnabledHint": "",
441
485
  "autostart": "Autostart",
@@ -444,12 +488,14 @@
444
488
  "publicAnnounceHostHint": "",
445
489
  "maxSeeds": "Max seeds",
446
490
  "seederPorts": "Peer ports",
447
- "seederPortsHint": "",
491
+ "seederPortMin": "Peer port start",
492
+ "seederPortMax": "Peer port end",
493
+ "seederPortsHint": "Inclusive range used by the local seeder (typically 6881–6889).",
448
494
  "saveSettings": "Save",
449
495
  "applyHint": "",
450
496
  "torrents": "Torrents",
451
497
  "torrentsEmpty": "No torrents",
452
- "torrentsEmptyHint": "Create a BT share in Files",
498
+ "torrentsEmptyHint": "Add a .torrent, or create a BT share in Files",
453
499
  "torrentsDesc": "",
454
500
  "colName": "Name",
455
501
  "colHash": "Hash",
@@ -461,8 +507,13 @@
461
507
  "copy": "Copy",
462
508
  "copied": "Copied",
463
509
  "statsTorrents": "Torrents",
510
+ "statsLibrary": "Library",
511
+ "statsLibraryHint": "Torrents in the panel library / file shares",
512
+ "statsTrackerLeftover": "Leftover (not in library)",
513
+ "statsTrackerLeftoverHint": "Hashes the local tracker has announced that are not torrent-library rows. Extra announce URLs are on the Trackers tab.",
464
514
  "statsPeers": "Peers",
465
515
  "statsAnnounces": "Announces",
516
+ "statsAnnouncesHint": "Announce requests seen by the tracker process",
466
517
  "statsJobs": "Jobs",
467
518
  "openShares": "Shares",
468
519
  "needExecute": "YSK_EXECUTE required to bind ports",
@@ -538,7 +589,71 @@
538
589
  "udpPortSameHttp": "Same HTTP ({{port}})",
539
590
  "udpPortClassic": "6969",
540
591
  "portSuggest8000": "8000",
541
- "announceHostUnset": ""
592
+ "announceHostUnset": "Not set",
593
+ "tabTrackers": "Trackers",
594
+ "addTorrent": "Add torrent",
595
+ "addTorrentTitle": "Add torrent",
596
+ "addTorrentHint": "Upload a .torrent or paste a magnet. Choose a Files folder. WebTorrent downloads missing files and seeds when complete.",
597
+ "dropTorrent": "Drop a .torrent here",
598
+ "chooseFile": "or choose a file",
599
+ "magnetLabel": "Magnet",
600
+ "magnetPlaceholder": "magnet:?xt=urn:btih:…",
601
+ "inspect": "Read",
602
+ "extraTrackersPreview": "Will also announce to {{n}} extra tracker(s)",
603
+ "saveLocation": "Save location",
604
+ "saveRootPublic": "Public files",
605
+ "newFolder": "New folder",
606
+ "destPreview": "Will write to",
607
+ "startDownload": "Start download",
608
+ "filterDownloading": "Downloading",
609
+ "filterPaused": "Paused",
610
+ "filterError": "Error",
611
+ "emptyDrop": "Drop a .torrent here, or choose a file",
612
+ "emptyHint": "Files go in the folder you pick. If they are already complete, this host seeds. Engine: WebTorrent — no extra download software.",
613
+ "pause": "Pause",
614
+ "resume": "Resume",
615
+ "openFolder": "Open folder",
616
+ "remove": "Remove",
617
+ "removeKeep": "Remove, keep files",
618
+ "removeDelete": "Remove and delete files",
619
+ "removeConfirm": "Remove this torrent from the library?",
620
+ "kindShare": "Share",
621
+ "filesInTorrent": "files",
622
+ "extraTrackersDesc": "Extra announce URLs. Library download/seed and file-share seeds use them in addition to the .torrent list. This does not open the local tracker to arbitrary swarms.",
623
+ "extraTrackersEmpty": "No extra trackers. Add HTTP(S), UDP, or WS(S) announce URLs so this host can find peers.",
624
+ "extraTrackerAdd": "Add",
625
+ "extraTrackerUrl": "Announce URL",
626
+ "extraTrackerApply": "Apply to current seeds",
627
+ "extraTrackerApplyOk": "Applied extra trackers",
628
+ "extraEnabled": "On",
629
+ "extraTrackerBad": "URL must start with http://, https://, udp://, ws://, or wss://",
630
+ "extraTrackerDup": "Already listed",
631
+ "extraTrackerLimit": "Maximum 32 extra trackers",
632
+ "addOk": "Added to library",
633
+ "savedTo": "Save",
634
+ "folderEmpty": "No subfolders",
635
+ "needTorrentFile": "Choose a .torrent file",
636
+ "torrentTooBig": ".torrent larger than 8 MiB",
637
+ "seedStatusDownloading": "Downloading",
638
+ "seedStatusChecking": "Checking",
639
+ "seedStatusPaused": "Paused",
640
+ "seedStatusQueued": "Queued",
641
+ "swarmLeftover": "Tracker has {{count}} announce(s) not in the library",
642
+ "addSourceSection": "Source",
643
+ "addSourceFile": "File",
644
+ "addSourceMagnet": "Magnet",
645
+ "previewSection": "Preview",
646
+ "saveRoot": "Root",
647
+ "clearFile": "Clear file",
648
+ "extraTrackersTitle": "Extra announce",
649
+ "extraTrackersEmptyTitle": "No extra trackers yet",
650
+ "extraEnabledCount": "{{count}} enabled",
651
+ "extraApplyHint": "Enable at least one tracker to apply to current seeds",
652
+ "destMode": "How to use this folder",
653
+ "seedExisting": "Seed existing files",
654
+ "downloadNewFolder": "Download into a new folder",
655
+ "destFileConflict": "A file named {{name}} already exists here. Pick another folder, or seed the existing file if it matches.",
656
+ "waitingPeers": "Waiting for peers. If the files are already on this host, add again and choose Seed existing files."
542
657
  },
543
658
  "catalog": {
544
659
  "sw": {
@@ -604,8 +719,58 @@
604
719
  "confWritten": "Conf written ({{status}})",
605
720
  "partialFail": "Not fully successful ({{status}}) — see notes",
606
721
  "statNodes": "Nodes",
722
+ "hitNoStats": "No edge stats yet",
723
+ "loopbackOriginBlocked": "Will not apply loopback origin {{url}} to a remote edge. Set a reachable origin first.",
724
+ "applyFailedHint": "Apply failed — see notes below",
725
+ "applyStatus": {
726
+ "draft": "Draft",
727
+ "planned": "Planned",
728
+ "applying": "Applying",
729
+ "applied": "Applied",
730
+ "failed": "Failed",
731
+ "partial": "Partial"
732
+ },
607
733
  "statSites": "Sites",
734
+ "pillNodesSites": "{{n}} nodes · {{s}} sites",
735
+ "statOnline": "Online",
736
+ "statHit": "Hit rate",
737
+ "hitUnknown": "Unknown",
738
+ "lastHealthHint": "Last probe {{at}} · {{ok}}",
739
+ "lastHealthNever": "Not probed yet — run Probe",
740
+ "lastHealthFail": "probe failed",
741
+ "healthLoopNeedSites": "Add a site first",
742
+ "nodeStatus": {
743
+ "online": "online",
744
+ "offline": "offline",
745
+ "draining": "draining",
746
+ "unknown": "unknown"
747
+ },
608
748
  "recentNotes": "Recent notes",
749
+ "previewOnlyNote": "Preview only — nothing was written to the edges.",
750
+ "statByRegion": "Region: ",
751
+ "statByApply": "Apply status: ",
752
+ "col": {
753
+ "origin": "Origin",
754
+ "edges": "Edges",
755
+ "apply": "Apply",
756
+ "dns": "DNS",
757
+ "edgesOnline": "Edges online / applied",
758
+ "dnsRr": "CDN DNS records"
759
+ },
760
+ "mode": {
761
+ "origin_pull": "Origin pull",
762
+ "reverse_proxy": "Reverse proxy",
763
+ "static_edge": "Static edge"
764
+ },
765
+ "dnsStrategy": {
766
+ "multi_a": "Multiple A records",
767
+ "cname": "CNAME",
768
+ "geo": "Geo"
769
+ },
770
+ "edgesOnlineApplied": "{{online}}/{{total}} online · {{applied}} applied",
771
+ "hitMiss": "Hits {{hits}} / misses {{misses}}",
772
+ "cacheBytes": "Cache ≈ {{n}} B",
773
+ "hitRateUnknown": "No access log with cache status and no cache directory, so hit rate cannot be estimated.",
609
774
  "edgeConfPreview": "Nginx edge conf preview",
610
775
  "tabs": {
611
776
  "nodes": "Nodes",
@@ -614,11 +779,41 @@
614
779
  "about": "About"
615
780
  },
616
781
  "nodesTitle": "CDN nodes ({{count}})",
617
- "nodesDesc": "Register control / origin / edge / dns. Probe updates status.",
782
+ "nodesDesc": "Register control-plane, origin, edge, and DNS nodes. Probe refreshes status.",
783
+ "offlineHint": "Offline — probe failed. Remove the node if it is leftover.",
618
784
  "colName": "Name",
619
785
  "colRole": "Role",
620
786
  "colStatus": "Status",
621
787
  "clearDrain": "Clear drain",
788
+ "drain": "Drain",
789
+ "drainTitle": "Stop sending new CDN traffic to this edge",
790
+ "drainDesc": "Drain “{{name}}”? Existing connections stay until they finish.",
791
+ "drainLastTitle": "This is the last edge — drain will leave every site without an edge",
792
+ "drainLastDesc": "“{{name}}” is the only edge. Drain it and all sites have no edge.",
793
+ "clearDrainTitle": "Accept new traffic on this edge again",
794
+ "clearDrainDesc": "Clear drain on “{{name}}”?",
795
+ "deleteNodeTitle": "Delete this CDN edge",
796
+ "deleteLastNodeTitle": "Delete the last edge — all sites will have no edge",
797
+ "purge": "Purge",
798
+ "previewTitle": "Preview nginx config (no write)",
799
+ "writeConfTitle": "Write edge nginx config files",
800
+ "applyEdgesTitle": "Apply this site to edges (writes nginx)",
801
+ "purgeTitle": "Purge cache on edges",
802
+ "dnsSyncTitle": "Write CDN DNS records",
803
+ "probeDnsTitle": "Probe edges and DNS (read-only)",
804
+ "distSslTitle": "Copy TLS materials to edges",
805
+ "leIssueTitle": "Issue a Let’s Encrypt certificate and distribute it",
806
+ "deleteSiteTitle": "Delete this CDN site",
807
+ "siteOpConfirmGeneric": "Run this action on “{{name}}”?",
808
+ "siteOpConfirmDesc": "Site “{{name}}” · {{action}}. This can change nginx, DNS, or certificates.",
809
+ "siteOpConfirm": {
810
+ "apply": "Apply this site to edges?",
811
+ "render": "Write nginx config for this site?",
812
+ "purge": "Purge cache for this site?",
813
+ "dns-sync": "Sync DNS for this site?",
814
+ "dist": "Distribute TLS to edges?",
815
+ "issue": "Issue Let’s Encrypt and distribute?"
816
+ },
622
817
  "emptyNodesTitle": "No CDN nodes yet",
623
818
  "emptyNodesDesc": "Use “+ Add node” to register an edge, then create sites.",
624
819
  "sitesTitle": "CDN sites ({{count}})",
@@ -689,7 +884,13 @@
689
884
  "deleteNodeDesc": "Deletes CDN node \"{{name}}\".",
690
885
  "deleteSiteDesc": "Deletes CDN site \"{{name}}\".",
691
886
  "deleteSiteC1": "Site policy and edge associations",
692
- "deleteSiteC2": "Applied nginx configs may need separate cleanup or re-apply"
887
+ "deleteSiteC2": "Applied nginx configs may need separate cleanup or re-apply",
888
+ "statOnlineOf": "Online {{n}}/{{total}}",
889
+ "colRegion": "Region",
890
+ "statDraining": "Draining {{n}}",
891
+ "statOffline": "Offline {{n}}",
892
+ "localTest": "local / test",
893
+ "statHitRate": "Hit rate {{v}}"
693
894
  },
694
895
  "cli": {
695
896
  "unknownCommand": "Unknown command: {{command}}\nRun `{{cli}} help`",
@@ -705,7 +906,7 @@
705
906
  },
706
907
  "help": {
707
908
  "blurb": "Control plane CLI — prefer --json for AI agents.\nDocs: docs/agent/README.md · docs/cli/reference.md · docs/agent/commands.json",
708
- "main": "{{product}} ({{cli}}) v{{version}}\n\nControl plane CLI — prefer --json for AI agents.\nDocs: docs/agent/README.md · docs/cli/reference.md · docs/agent/commands.json\n\nUsage:\n {{cli}} <command> [options]\n\nCommands:\n setup Init dataDir + admin\n update Self-update check/apply\n serve HTTP API + Web UI\n system unit-install Install ysk-server.service [--enable]\n tools List tools; tools run --tool <name> [--dry-run]\n ask NL → AI plan [--execute]\n projects list|get|create|deploy|stop|health|backup|template\n backup all|list|status|restore|delete|schedule|control-plane|settings|restic\n templates App templates\n hosting nginx|dns|db|firewall helpers\n dns zone|zones (AI alias → hosting dns-*)\n logs sources|query|journal|overview\n host overview|metrics (read-only)\n nginx status|list|test|sync\n ssl list|get (certificates)\n db-cluster list|get|create|plan (HA plan-first)\n ssh-key list|create|import|public|export|install|delete (SSH identity vault)\n ssh-2fa list|enroll|confirm|install|pam|retire (SSH login TOTP ≠ panel 2FA)\n services Host service matrix (systemctl probe)\n defense | protection status|ban|unban|whitelist\n security status|sessions|api-keys (2FA flags · session revoke · API keys)\n cdn nodes|sites|render|apply|purge|probe|dashboard|health-loop|from-project\n agents runtimes|fleet list|commands|register (panel + edge)\n agent run Outbound fleet poller (experimental)\n store status|export|import|migrate (json|sqlite|postgres document backends)\n files list|read|write|mkdir|rm|stat|rename|copy|move|chmod|trash|shares (sandbox)\n cron list|create|delete|enable|disable|run|install|status\n email domains|mailboxes|deliverability|bootstrap|dns (panel parity)\n health Local mode snapshot or --url http://host:port/health\n readiness | doctor Production readiness (honest)\n migrate inventory|host|post|status|resume (full host migrate)\n version | help\n\nGlobal:\n --json JSON stdout (AI)\n --data-dir PATH\n --config PATH\n --help | --version\n\nExit: 0 ok · 1 error · 2 validation · 3 blocked · 4 not found · 5 host error\n\nSafety:\n Dangerous ops default to dry-run (plan only).\n Pass --execute (alias --apply) + env YSK_EXECUTE=1 to mutate host.\n\nExamples:\n {{cli}} readiness --json\n {{cli}} host --json\n {{cli}} nginx status --json\n {{cli}} ssl list --json\n {{cli}} projects get --id UUID --json\n {{cli}} defense ban --ip 1.2.3.4 --json # dry-run plan\n {{cli}} projects list --json\n {{cli}} logs query --source journal: --lines 100 --json\n {{cli}} tools --json"
909
+ "main": "{{product}} ({{cli}}) v{{version}}\n\nControl plane CLI — prefer --json for AI agents.\nDocs: docs/agent/README.md · docs/cli/reference.md · docs/agent/commands.json\n\nUsage:\n {{cli}} <command> [options]\n\nCommands:\n setup Init dataDir + admin\n update Self-update check/apply\n serve HTTP API + Web UI\n system unit-install Install ysk-server.service [--enable]\n stack plans|bundles|status|install|uninstall\n tools List tools; tools run --tool <name> [--dry-run]\n ask NL → AI plan [--execute]\n projects list|get|create|deploy|stop|health|backup|template\n users list|create|totp\n packages list\n rbac list|show\n audit list\n backup all|list|status|restore|delete|schedule|control-plane|settings|restic\n templates App templates\n hosting nginx|dns|db|firewall helpers\n dns zone|zones|lookup\n logs sources|query|journal|overview\n host overview|metrics (read-only)\n nginx status|list|test|sync\n ssl list|get (certificates)\n db-cluster list|get|create|plan (HA plan-first)\n ssh-key list|create|import|public|export|install|delete (SSH identity vault)\n ssh-2fa list|enroll|confirm|install|pam|retire (SSH login TOTP ≠ panel 2FA)\n services Host service matrix (systemctl probe)\n defense | protection status|ban|unban|whitelist\n security status|sessions|api-keys (2FA flags · session revoke · API keys)\n cdn nodes|sites|render|apply|purge|probe|dashboard|health-loop|from-project\n agents runtimes|fleet list|commands|register (panel + edge)\n agent run Outbound fleet poller (experimental)\n store status|export|import|migrate (json|sqlite|postgres document backends)\n files list|read|write|mkdir|rm|stat|rename|copy|move|chmod|trash|shares (sandbox)\n cron list|create|delete|enable|disable|run|install|status\n email domains|mailboxes|deliverability|bootstrap|dns (panel parity)\n health Local mode snapshot or --url http://host:port/health\n notifications list\n readiness | doctor Production readiness (honest)\n migrate inventory|host|post|status|resume|orphan-homes (full host migrate)\n vpn WireGuard / OpenVPN\n vnc accounts|clients|share\n apache sites|settings\n network ifaces|exposure|real-ip\n real-ip CDN Real IP\n updates inventory|apply\n software list|install|uninstall\n db MySQL / MariaDB / PostgreSQL\n redis status|keys|get|set\n ftp accounts|status\n runtimes list|install\n bt-tracker status|settings\n validators list|chains|disk|get (Beta)\n docker status|ps|images|compose|prune (engine)\n version | help\n\nGlobal:\n --json JSON stdout (AI)\n --data-dir PATH also --data-dir=PATH or YSK_DATA_DIR\n --config PATH\n --locale CODE CLI language (default en). Also YSK_LOCALE.\n Codes: en zh-HK zh-CN ja ko hi es ar fr bn pt id ur\n --limit N --offset N Slice large JSON lists (software / updates / host metrics / rbac)\n --help | --version\n\nExit: 0 ok · 1 error · 2 validation · 3 blocked · 4 not found · 5 host error\n\nSafety:\n Dangerous ops default to dry-run (plan only).\n Pass --execute (alias --apply) + env YSK_EXECUTE=1 to mutate host.\n Command names and flags are always English. --locale only translates messages.\n\nExamples:\n {{cli}} readiness --json\n {{cli}} host --json\n {{cli}} nginx status --json\n {{cli}} ssl list --json\n {{cli}} projects get --id UUID --json\n {{cli}} defense ban --ip 1.2.3.4 --json # dry-run plan\n {{cli}} projects list --json\n {{cli}} --locale=zh-HK help\n {{cli}} logs query --source journal: --lines 100 --json\n {{cli}} tools --json"
709
910
  },
710
911
  "usage": {
711
912
  "tools": {
@@ -1295,7 +1496,7 @@
1295
1496
  "--name": {
1296
1497
  "name": {
1297
1498
  "--domain": {
1298
- "66e857": "Usage: ysk-server projects create --name <name> [--domain d] [--runtime node|php|static|python|go|rust] [--template id]\n"
1499
+ "66e857": "Usage: ysk-server projects create --name <name> [--domain d] [--runtime node|php|static|python|go|rust] [--template id] [--git-url URL] [--branch B] [--create-dns] [--create-mail] [--server-ip A.B.C.D] [--server-ipv6 ADDR]\n"
1299
1500
  }
1300
1501
  }
1301
1502
  }
@@ -1313,7 +1514,7 @@
1313
1514
  "--id": {
1314
1515
  "id": {
1315
1516
  "--git-url": {
1316
- "a513f5": "Usage: ysk-server projects git-deploy --id ID [--git-url URL] [--branch main] [--no-redeploy] [--depth 1] [--entry f]\n"
1517
+ "a513f5": "Usage: ysk-server projects git-deploy --id ID [--git-url URL] [--branch|--ref main] [--no-redeploy] [--depth 1] [--entry f]\n"
1317
1518
  }
1318
1519
  }
1319
1520
  }
@@ -1331,7 +1532,7 @@
1331
1532
  "get": {
1332
1533
  "create": {
1333
1534
  "deploy": {
1334
- "253b48": "Usage: ysk-server projects list|get|create|deploy|git-deploy|stop|backup|template|health [options]\n deploy --id UUID [--entry f] [--port N] [--fpm|--builtin] [--reload]\n git-deploy --id UUID [--git-url URL] [--branch B] [--no-redeploy]\n"
1535
+ "253b48": "Usage: ysk-server projects list|get|create|deploy|git-deploy|git|stop|backup|template|ftp|health [options]\n deploy --id UUID [--entry f] [--port N] [--fpm|--builtin] [--reload]\n git-deploy --id UUID [--git-url URL] [--branch|--ref B] [--no-redeploy]\n git status|log|fetch|checkout|reset|auth|hook|deploy --id UUID [--ref R] [--unshallow] [--yes]\n git auth --id UUID --token T|--deploy-key|--pin-host\n git hook --id UUID --enable|--rotate|--disable\n ftp --id UUID --password P [--user NAME] [--home app|root]\n"
1335
1536
  }
1336
1537
  }
1337
1538
  }
@@ -1575,7 +1776,7 @@
1575
1776
  },
1576
1777
  "status": {
1577
1778
  "bans": {
1578
- "a8d96b": "Usage: {{CLI_NAME}} defense status|bans|suspects|ban|unban|whitelist|stack-apply|fail2ban|firewall|timeline|presets [--json]\n` +\n ` bans [--q text] [--source fail2ban|panel|ufw|auto]\n` +\n ` suspects [--q text]\n` +\n ` stack-apply [--execute] # UFW + fail2ban + current preset\n` +\n ` fail2ban | firewall # deep probes (honest)\n` +\n ` timeline [--limit N] [--q text]\n` +\n ` presets # list + activePreset\n"
1779
+ "a8d96b": "Usage: {{CLI_NAME}} defense status|bans|suspects|ban|unban|whitelist|stack-apply|fail2ban|firewall|timeline|presets [--json]\n bans [--q text] [--source fail2ban|panel|ufw|auto]\n suspects [--q text]\n stack-apply [--execute] # UFW + fail2ban + current preset\n fail2ban | firewall # deep probes (honest)\n timeline [--limit N] [--q text]\n presets # list + activePreset\n"
1579
1780
  }
1580
1781
  }
1581
1782
  }
@@ -1597,7 +1798,7 @@
1597
1798
  "--username": {
1598
1799
  "u": {
1599
1800
  "--password": {
1600
- "7145c7": "Usage: ysk-server users create --username <u> --password <p> [--role operator|viewer|admin] [--package-id id]\n"
1801
+ "7145c7": "Usage: ysk-server users create --username <u> --password <p> [--role operator|viewer|admin] [--package-id id] [--locale zh-HK]\n"
1601
1802
  }
1602
1803
  }
1603
1804
  }
@@ -1741,7 +1942,7 @@
1741
1942
  }
1742
1943
  },
1743
1944
  "x": {
1744
- "972912": "Usage:\n ysk-server migrate inventory [--data-dir PATH] --json\n ysk-server migrate host --target root@IP [--identity-file PATH|--identity-id ID|--password PW] --execute [--maintenance] [--force-wipe-target]\n ysk-server migrate post --job ID --data-dir PATH --execute # on target\n ysk-server migrate status [--job ID]\n ysk-server migrate resume --job ID --execute\n"
1945
+ "972912": "Usage:\n ysk-server migrate inventory [--data-dir PATH] --json\n ysk-server migrate host --target root@IP [--identity-file PATH|--identity-id ID|--password PW] --execute [--maintenance] [--force-wipe-target]\n ysk-server migrate post --job ID --data-dir PATH --execute # on target\n ysk-server migrate status [--job ID]\n ysk-server migrate resume --job ID --execute\n ysk-server migrate orphan-homes [--data-dir PATH] --json\n ysk-server migrate orphan-homes --path /home/ysk-server-UUID --confirm PATH --execute\n"
1745
1946
  },
1746
1947
  "hostingHelp": "Usage: ysk-server hosting <sub>\n Dangerous ops default dry-run; add --execute (+ YSK_EXECUTE=1) to apply\n nginx | nginx-sync [--execute]\n redis-provision | postgres-provision | mysql-provision [--execute]\n dns-zone --zone X --ip A.B.C.D [--ipv6 X:X::X] [--validate] [--reload]\n dns-zones | powerdns-status | powerdns-install [--install|--execute]\n powerdns-load --zone X --ip A.B.C.D [--load|--execute]\n email-apply --domain X [--install|--execute]\n email-mailbox --domain X --local user [--password P] [--ip A.B.C.D] [--system]\n ftps-apply --domain X [--install|--execute]\n runtimes | runtime-install --kind node|php|python|go|rust --version V [--install|--execute]\n dovecot-passdb --domain X | --all\n webmail-apply --domain webmail.example.com [--download]\n public-files --domain files.example.com [--reload]\n email-bootstrap --domain example.com --ip A.B.C.D [--install|--execute]\n email-deliverability --domain example.com # PTR/DNSBL/warmup pack (honest)\n firewall-apply [--smtp] [--execute]\n",
1747
1948
  "logsQuery": "Usage: {{CLI_NAME}} logs query --source <id> [--lines N] [--grep G] [--since 1h] [--priority err]\n source examples: journal: journal:nginx.service file:syslog project:<uuid>\n {{CLI_NAME}} logs sources --json\n {{CLI_NAME}} logs journal [--unit nginx.service] --json\n"
@@ -1874,6 +2075,7 @@
1874
2075
  }
1875
2076
  },
1876
2077
  "common": {
2078
+ "all": "All",
1877
2079
  "cancel": "Cancel",
1878
2080
  "confirm": "Confirm",
1879
2081
  "refresh": "Refresh",
@@ -1896,9 +2098,12 @@
1896
2098
  "languageNative": "English",
1897
2099
  "language": "Language",
1898
2100
  "switchLanguage": "Switch language",
2101
+ "showPassword": "Show",
2102
+ "hidePassword": "Hide",
1899
2103
  "searchGlobal": "Search pages & resources…",
1900
2104
  "menu": "Menu",
1901
2105
  "processing": "Working…",
2106
+ "unavailable": "Not available right now",
1902
2107
  "retry": "Retry",
1903
2108
  "success": "Success",
1904
2109
  "failed": "Failed",
@@ -1910,7 +2115,9 @@
1910
2115
  "noData": "No data",
1911
2116
  "input": "Input",
1912
2117
  "pleaseEnter": "Enter {{value}}",
2118
+ "required": "Required",
1913
2119
  "about": "About",
2120
+ "more": "More",
1914
2121
  "operation": "Actions",
1915
2122
  "delete": "Delete",
1916
2123
  "edit": "Edit",
@@ -1996,7 +2203,8 @@
1996
2203
  "show": "Show",
1997
2204
  "done": "Done",
1998
2205
  "next": "Next",
1999
- "previous": "Previous"
2206
+ "previous": "Previous",
2207
+ "redirectedTo": "Opened {{to}} (was {{from}})"
2000
2208
  },
2001
2209
  "cron": {
2002
2210
  "presetCdTrue": "cd app + true (test)",
@@ -2135,9 +2343,44 @@
2135
2343
  "sourceHost": "Host",
2136
2344
  "noHostJobs": "No crontab jobs in this scope",
2137
2345
  "hostPartial": "Could not read every user crontab (root required)",
2138
- "pendingInstall": "Pending install ({{count}})"
2346
+ "pendingInstall": "Pending install ({{count}})",
2347
+ "hourRange": "Hour must be 0–23.",
2348
+ "minuteRange": "Minute must be 0–59.",
2349
+ "hoursCommon": "Common hours",
2350
+ "hoursAll": "All hours",
2351
+ "invalidExpr": "Not a valid 5-field cron expression.",
2352
+ "needCommand": "Command is required.",
2353
+ "needUser": "Choose a project or a system user.",
2354
+ "hostCounts": "Host lines",
2355
+ "hostCountsVal": "{{ysk}} · other {{other}} · total {{total}}",
2356
+ "hostYskYes": "panel lines present",
2357
+ "hostYskNo": "no panel lines",
2358
+ "emptyHostCrontab": "No crontab for {{user}}.",
2359
+ "writtenOnHost": "Written",
2360
+ "registeredJobsChip": "Registered",
2361
+ "registeredVsWritten": "Registered in the panel vs written to host crontab",
2362
+ "installPreviewTitle": "Preview before installing to system crontab",
2363
+ "installPreviewDesc": "This merges the YSK block into the host crontab. Existing non-YSK lines stay.",
2364
+ "installPreviewMerge": "Install writes a YSK Server crontab merge block. It does not replace the whole crontab.",
2365
+ "installPreviewEmpty": "No pending managed jobs — install still refreshes the YSK block.",
2366
+ "editJobTitle": "Edit job",
2367
+ "editJobDesc": "Changes stay in the panel until you install to the system crontab.",
2368
+ "saveJob": "Save (management only)",
2369
+ "panelLines": "Panel lines",
2370
+ "otherLines": "Other lines",
2371
+ "totalLines": "Total",
2372
+ "writtenOnHostHint": "Lines already written to the host crontab",
2373
+ "registeredJobsHint": "Jobs registered in the panel (including pending install)",
2374
+ "pendingInstallCount": "{{n}} pending install",
2375
+ "systemJobBadge": "No project · system user"
2139
2376
  },
2140
2377
  "dashboard": {
2378
+ "serviceAria": "{{name}}: {{state}}",
2379
+ "sev": {
2380
+ "ok": "OK",
2381
+ "warn": "Warning",
2382
+ "bad": "Problem"
2383
+ },
2141
2384
  "title": "Dashboard",
2142
2385
  "health": "Health",
2143
2386
  "protection": "Protection mode",
@@ -2194,7 +2437,8 @@
2194
2437
  "warnCount": " · warn {{count}}",
2195
2438
  "applyAuditBadge": "Apply audit · ok {{ok}} · warn {{warn}} · bad {{bad}}",
2196
2439
  "executeBadge": "EXECUTE {{state}}",
2197
- "executeLabel": "EXECUTE",
2440
+ "executeLabel": "System change",
2441
+ "publicNo2fa": "This panel listens on all interfaces and your admin account has no 2FA.",
2198
2442
  "go": "Open",
2199
2443
  "open": "Open",
2200
2444
  "noCriticalWarn": "No critical or warning alerts",
@@ -2224,29 +2468,41 @@
2224
2468
  "runtime": "Runtime",
2225
2469
  "runtimeHint": "Sets default runtime version and deploy style",
2226
2470
  "runtimeVersion": "Runtime version",
2227
- "versionHint": "Stored as project runtime_version",
2471
+ "versionHint": "Writes the project runtime version setting",
2228
2472
  "serverIpv4": "Server IPv4",
2229
2473
  "serverIpv4Hint": "DNS A / mail SPF",
2230
2474
  "serverIpv4Ph": "This host public IPv4",
2231
2475
  "serverIpv6": "Server IPv6 (optional)",
2232
2476
  "serverIpv6Hint": "Writes AAAA / ip6: when set",
2233
2477
  "serverIpv6Ph": "Public IPv6 (optional)",
2478
+ "needDomainFirst": "Enter a domain first",
2234
2479
  "withDns": "Also create DNS zone",
2235
2480
  "withDnsDesc": "Needs domain; registration only — apply zone on DNS page",
2236
2481
  "withMail": "Also register mail domain",
2237
2482
  "withMailDesc": "Needs domain; install software & DNS on mail detail page",
2238
- "withDb": "Also draft MySQL database",
2239
- "withDbDesc": "Control-plane registration; apply on SQL engine page",
2483
+ "withDb": "Also draft a database",
2484
+ "withDbDesc": "Control-plane registration; apply on the SQL engine page",
2240
2485
  "wizardHint": "Quick create does not go live automatically",
2241
2486
  "wizardSubmit": "Create",
2242
2487
  "wizardOk": "Created",
2243
2488
  "wizardPartial": "Partially failed",
2244
2489
  "notifCenterTitle": "Notifications ({{count}})",
2245
2490
  "notifCenterDesc": "Critical {{critical}} · warn {{warn}} · info {{info}}",
2246
- "noNotifs": "No notifications",
2491
+ "noNotifs": "No notifications. Recent audit events are on Overview.",
2247
2492
  "noNotifsDesc": "System alerts and todos appear here",
2248
2493
  "applyAuditTitle": "Apply status audit",
2249
- "applyAuditDesc": "ok {{ok}} · warn {{warn}} · bad {{bad}}"
2494
+ "applyAuditDesc": "ok {{ok}} · warn {{warn}} · bad {{bad}}",
2495
+ "barTitle": "{{count}} host alert(s)",
2496
+ "levelCritical": "Critical",
2497
+ "levelWarn": "Warning",
2498
+ "levelInfo": "Info",
2499
+ "colTitle": "Alert",
2500
+ "colDetail": "Detail",
2501
+ "colSource": "Source",
2502
+ "notifSearch": "Search alerts",
2503
+ "notifAll": "All",
2504
+ "notifDismiss": "Hide",
2505
+ "goFix": "Fix"
2250
2506
  },
2251
2507
  "dataTable": {
2252
2508
  "empty": "No data",
@@ -2306,12 +2562,26 @@
2306
2562
  "emptyDbInstallFirst": "Install {{engine}} via the banner, then Create database",
2307
2563
  "emptyDbCannotProvision": "Cannot create databases on the server right now",
2308
2564
  "emptyDbCreateHint": "Use Create database, then Apply",
2565
+ "emptyDbHostHasRows": "The host already has databases that are not in this control-plane list.",
2566
+ "registeredVsHostHint": "Registered in the panel / found on the host",
2567
+ "registeredCount": "Registered",
2568
+ "hostCount": "On host",
2569
+ "registeredUsers": "Registered users",
2570
+ "registeredUsersHint": "Panel registrations only — not every MySQL account",
2571
+ "hostStillExists": "Still on host",
2572
+ "expiresLabel": "Expires",
2573
+ "dumpNeedRegistered": "Register a database in the panel first",
2574
+ "dumpFirstDbTitle": "Export the first registered database",
2575
+ "importNeedRegistered": "Register a database in the panel first",
2576
+ "importLatestNeedConfirm": "Needs confirmation — imports into the registered database",
2577
+ "hostHasUntracked": "{{count}} host databases are not registered in the panel",
2578
+ "hostInventoryHint": "The table is control-plane rows only. Live names come from SHOW DATABASES.",
2309
2579
  "userList": "Users",
2310
2580
  "userListDesc": "Grant users access to databases",
2311
2581
  "createUserBtn": "+ Create user",
2312
2582
  "noUsersYet": "No users yet",
2313
2583
  "tempReadonlyUsers": "Temporary read-only users",
2314
- "tempReadonlyDesc": "Control plane marks expired after TTL;",
2584
+ "tempReadonlyDesc": "Expired accounts are dropped from the server when this page loads (needs EXECUTE + root). Rows left below still exist on the host.",
2315
2585
  "dbName": "Database name",
2316
2586
  "ttlHours": "TTL (hours)",
2317
2587
  "ttlHoursHint": "Marked invalid after expiry",
@@ -2320,7 +2590,14 @@
2320
2590
  "expiresAt": "Expires",
2321
2591
  "revokeRegistration": "Revoke registration",
2322
2592
  "remoteDbHosts": "Remote database hosts",
2323
- "remoteDbHostsDesc": "Register connection targets (password not echoed back)",
2593
+ "remoteDbHostsDesc": "Register connection targets (password not echoed back). Saved ≠ reachable until Test connection.",
2594
+ "remoteTest": "Test connection",
2595
+ "remoteTestDone": "Remote host probe finished",
2596
+ "remoteTestOk": "reachable",
2597
+ "remoteTestFail": "unreachable",
2598
+ "remoteNotChecked": "not tested",
2599
+ "remoteDeleteTitle": "Remove this registration only",
2600
+ "remoteDeleteConfirm": "Remove registration {{name}}? The remote server is not changed.",
2324
2601
  "displayName": "Display name",
2325
2602
  "prodReplicaPlaceholder": "Production replica",
2326
2603
  "remoteHostSaved": "Remote host saved",
@@ -2345,7 +2622,7 @@
2345
2622
  "import": "Import",
2346
2623
  "importOk": "Import complete",
2347
2624
  "importFailed": "Import failed",
2348
- "deleteDbTitle": "Delete database registration?",
2625
+ "deleteDbTitle": "Remove control-plane registration (does not DROP the server database)",
2349
2626
  "deleteDbDesc": "Removes control-plane record only; does not DROP the server database.",
2350
2627
  "deleteUserTitle": "Delete user registration?",
2351
2628
  "deleteUserDesc": "Removes control-plane record only.",
@@ -2374,8 +2651,11 @@
2374
2651
  "update": "Update",
2375
2652
  "alsoCreateRole": "Also create role",
2376
2653
  "cluster": {
2654
+ "standaloneOtherEngines": "This engine is standalone. Other engines have clusters: {{names}}.",
2655
+ "roleUnassigned": "No role assigned",
2377
2656
  "title": "Cluster",
2378
- "description": "Plan → write management → apply → probe → peer distribute / fleet. Default dry-run.",
2657
+ "description": "Plan → write management files → apply → probe → distribute to peers / fleet. Default is dry-run (no host restart).",
2658
+ "redirectedFromCluster": "You were redirected here from /cluster. This is the database cluster tab.",
2379
2659
  "kindGalera": "Simple Galera",
2380
2660
  "kindMysqlReplica": "MySQL primary/replica",
2381
2661
  "kindPgReplica": "PostgreSQL streaming replica",
@@ -2404,10 +2684,37 @@
2404
2684
  "registrationDeleted": "Registration deleted",
2405
2685
  "nodes": "Nodes",
2406
2686
  "remoteInstallPlan": "Remote install plan",
2687
+ "fleetSession": "Fleet agent session id",
2688
+ "fleetSessionHint": "Optional. Pick a registered fleet session (uses fleet, not SSH). Leave empty for SSH scp.",
2689
+ "fleetSessionPh": "Agents page session UUID",
2690
+ "fleetSessionNone": "None — use SSH",
2691
+ "fleetSessionOpenAgents": "Open /agents to register a session",
2692
+ "createWizardTitle": "Opens the plan wizard. Needs a local IP and ≥1 peer. Writes panel artifacts only (dry-run). Does not restart the engine until you apply.",
2693
+ "bootstrap": "Bootstrap",
2694
+ "fleetApply": "Fleet apply",
2695
+ "planTitle": "Regenerate the cluster plan (no host change)",
2696
+ "writeFileTitle": "Write management files under the panel data dir (dry-run)",
2697
+ "probeLocalTitle": "Probe this host only",
2698
+ "probeAllTitle": "Probe every registered member",
2699
+ "bootstrapTitle": "Install local drop-in and bootstrap the first node",
2700
+ "remoteInstallPlanTitle": "Preview remote install (no execute)",
2701
+ "downloadBundleTitle": "Download peer conf bundle (.tar.gz)",
2702
+ "pushPlanTitle": "Preview push to peer (no scp)",
2703
+ "fleetSyncPlanTitle": "Preview fleet sync (no execute)",
2704
+ "fleetApplyTitle": "Enqueue apply on fleet members?",
2705
+ "status": {
2706
+ "healthy": "Healthy",
2707
+ "planned": "Planned",
2708
+ "partial": "Partial",
2709
+ "failed": "Failed",
2710
+ "draft": "Draft",
2711
+ "degraded": "Degraded",
2712
+ "applied": "Applied"
2713
+ },
2407
2714
  "fleetSyncPlan": "Fleet sync plan",
2408
2715
  "standaloneTitle": "Currently: standalone",
2409
2716
  "standaloneRepl": "No replica registered. Set primary/master + replica to generate conf and scripts.",
2410
- "standaloneHa": "No HA registered. Add peer nodes to generate conf plan, then bootstrap / join.",
2717
+ "standaloneHa": "No HA registered. Add at least one peer, generate a conf plan, then bootstrap the first node and join the others.",
2411
2718
  "recentProbe": "Recent probe (local wsrep)",
2412
2719
  "probeRequired": "healthy requires a passing probe",
2413
2720
  "planPreview": "Plan preview",
@@ -2454,6 +2761,7 @@
2454
2761
  "remoteInstalled": "Remote installed",
2455
2762
  "fleetSynced": "Fleet sync queued",
2456
2763
  "fleetApplyQueued": "Fleet apply queued",
2764
+ "engineNotInstalled": "{{engine}} is not installed on this host — install it first, or open the engine that is actually running.",
2457
2765
  "plan": "Plan",
2458
2766
  "writeFile": "Write files",
2459
2767
  "applyLocal": "Apply local",
@@ -2470,8 +2778,7 @@
2470
2778
  "delete": "Delete",
2471
2779
  "probe": "Probe",
2472
2780
  "name": "Name",
2473
- "type": "Type",
2474
- "status": "Status"
2781
+ "type": "Type"
2475
2782
  },
2476
2783
  "console": {
2477
2784
  "dataBrowse": "Browse data",
@@ -2479,6 +2786,7 @@
2479
2786
  "realtime": "Live",
2480
2787
  "reload": "Reload",
2481
2788
  "needRestart": "Restart required",
2789
+ "affectsProjects": "Sites and services that use this engine will be interrupted.",
2482
2790
  "lifecycle": "Lifecycle",
2483
2791
  "overview": "Overview",
2484
2792
  "actionDone": "{{action}} done",
@@ -2510,10 +2818,10 @@
2510
2818
  "installEngine": "Use the banner above to install {{title}}.",
2511
2819
  "reloadConfig": "Reload config",
2512
2820
  "disableBoot": "Disable on boot",
2821
+ "disableBootConfirm": "The engine will not start after reboot until you enable it again.",
2513
2822
  "needRights": "Needs system-change rights and admin. Failures show reasons — never fake success.",
2514
2823
  "noneFetched": "— none —"
2515
2824
  },
2516
- "expiresLabel": "Expires",
2517
2825
  "importEntry": "Entry: {{url}}",
2518
2826
  "adminerRiskFull": "Public Adminer is risky — restrict source IPs or add HTTP auth. Needs PHP-FPM socket (default php8.2).",
2519
2827
  "adminerWriteHintFull": "Write only = management written;",
@@ -2537,7 +2845,10 @@
2537
2845
  "unfreezeOk": "{{engine}} repair complete",
2538
2846
  "startAfterUnfreeze": "Start service (auto-runs repair plan on failure)",
2539
2847
  "serviceDownTitle": "Database service is down",
2540
- "serviceDownBody": "Service is unhealthy"
2848
+ "serviceDownBody": "Service is unhealthy",
2849
+ "adoptHostDb": "Register in panel (no create): {{name}}",
2850
+ "adoptHostDbTitle": "Registers the name in the control plane only — does not change host data",
2851
+ "cleanupExpiredTempUsersTitle": "Drops panel-issued temporary users that have expired"
2541
2852
  },
2542
2853
  "dialogs": {
2543
2854
  "confirmDefault": "Confirm",
@@ -2581,6 +2892,8 @@
2581
2892
  "zonesTitle": "Zones ({{count}})",
2582
2893
  "zonesDesc": "After create, write/apply the zone",
2583
2894
  "createZone": "+ Create zone",
2895
+ "mailZonesMissing": "Email domains have no DNS zone here: {{domains}}.",
2896
+ "createMailZone": "Create mail zone",
2584
2897
  "colZoneName": "Zone name",
2585
2898
  "colServerIp": "Server IP",
2586
2899
  "colTemplate": "Template",
@@ -2657,7 +2970,10 @@
2657
2970
  "validateDesc": "Create/edit auto-validates (CNAME clashes, A/AAAA format, etc.).",
2658
2971
  "createZoneTitle": "Create DNS zone",
2659
2972
  "createZoneDesc": "Generate records from a template",
2973
+ "createZoneNeedValid": "Enter a valid zone name and IPv4 address",
2660
2974
  "zoneNameHint": "e.g. example.com (no trailing dot)",
2975
+ "invalidZone": "Invalid zone name. Use a real domain (e.g. example.com).",
2976
+ "invalidIpv4": "Invalid IPv4. Each octet must be 0–255.",
2661
2977
  "serverIpv4": "Server IPv4",
2662
2978
  "serverIpv4Hint": "Address used for template A records",
2663
2979
  "thisHostIpv4": "This host public IPv4",
@@ -2751,6 +3067,9 @@
2751
3067
  "lookupServer": "Server (@)",
2752
3068
  "lookupServerHint": "127.0.0.1 = local auth; public IP tests external; empty = system resolver",
2753
3069
  "healthHealPdns": "Heal PowerDNS bind",
3070
+ "healNeedInstall": "PowerDNS is not installed — install it on the Software tab first",
3071
+ "applyNeedService": "DNS service is not running — start or install it before apply",
3072
+ "deleteZoneNeedName": "Delete this zone — you will type the zone name to confirm",
2754
3073
  "healthHealPdnsHint": "Set local-address to public IP to avoid clashing with systemd-resolved on 0",
2755
3074
  "healthHealPdnsOk": "PowerDNS bound to {{ip}} and start attempted",
2756
3075
  "healthHealPdnsFailed": "PowerDNS heal failed",
@@ -2761,7 +3080,264 @@
2761
3080
  "aboutHealthTitle": "Service health",
2762
3081
  "aboutHealthBody": "Use Tools to probe PowerDNS, heal bind, and open port 53.",
2763
3082
  "aboutStackTitle": "Software",
2764
- "aboutStackBody": "Check/update the PowerDNS package under Software."
3083
+ "aboutStackBody": "Check/update the PowerDNS package under Software.",
3084
+ "createMailZoneNow": "Created mail zone {{domain}}",
3085
+ "toolsFirewallTitle": "Firewall (UFW)",
3086
+ "toolsFirewallHint": "Allow or deny port 53. This does not start or stop PowerDNS.",
3087
+ "toolsUnitTitle": "PowerDNS unit",
3088
+ "toolsUnitHint": "systemd unit pdns — start, stop, restart, reload.",
3089
+ "installConfirmTitle": "Install PowerDNS?",
3090
+ "installConfirmDesc": "Installs pdns-server and writes the managed authoritative config. Needs root and YSK_EXECUTE=1.",
3091
+ "installConfirmConsequence": "After install and start, PowerDNS will bind port 53.",
3092
+ "installPort53Busy": "Something already listens on port 53. PowerDNS may fail to bind until that listener is stopped or healed.",
3093
+ "installPort53BusyConsequence": "Heal bind or stop the other listener before expecting answers on port 53."
3094
+ },
3095
+ "docker": {
3096
+ "title": "Docker",
3097
+ "subtitle": "Install Docker Engine, then manage containers, images, volumes, and validator Compose stacks on this host.",
3098
+ "refresh": "Refresh",
3099
+ "notInstalled": "Docker Engine is not installed. Install docker.io and docker-compose-v2 from this page.",
3100
+ "protected": "Protected",
3101
+ "pruneConfirm": "Type PRUNE to confirm any prune",
3102
+ "needEngineTitle": "Install Docker Engine first",
3103
+ "stopEngineDesc": "This stops the Docker engine and all {{n}} container(s) on this host.",
3104
+ "notInstalledValue": "Not installed",
3105
+ "nameHint": "Letters, digits, underscore, dot, hyphen (max 128)",
3106
+ "volPlaceholder": "my-data",
3107
+ "netPlaceholder": "my-net",
3108
+ "runPorts": "Publish ports",
3109
+ "runPortsHint": "host:container per line, e.g. 8080:80",
3110
+ "runEnv": "Environment",
3111
+ "runEnvHint": "KEY=value per line",
3112
+ "runRestart": "Restart policy",
3113
+ "runNetwork": "Network",
3114
+ "runVolumes": "Volumes",
3115
+ "runVolumesHint": "volume:dest per line",
3116
+ "runAdvancedHint": "For multi-service stacks use validator nodes or Compose files already on this host.",
3117
+ "daemonConfirmTitle": "Apply daemon settings?",
3118
+ "daemonConfirmDesc": "Writes daemon.json and restarts docker.service. All containers will be interrupted.",
3119
+ "settingsHint": "Safe daemon.json subset only. Apply writes the file and restarts docker.service.",
3120
+ "cli": {
3121
+ "usage": "Usage: ysk-server docker status|ps|images|volumes|networks|df|logs|inspect|exec|start|stop|restart|rm|pull|run|prune|engine|compose [--image IMG] [--name N] [--preset version|help|hostname] [--bin BIN] [--project P] [--execute] [--json]"
3122
+ },
3123
+ "tab": {
3124
+ "overview": "Overview",
3125
+ "containers": "Containers",
3126
+ "images": "Images",
3127
+ "compose": "Compose",
3128
+ "volumes": "Volumes",
3129
+ "networks": "Networks",
3130
+ "prune": "Prune",
3131
+ "settings": "Settings",
3132
+ "about": "About"
3133
+ },
3134
+ "col": {
3135
+ "engine": "Engine",
3136
+ "containers": "Containers",
3137
+ "version": "Version",
3138
+ "dataRoot": "Data root",
3139
+ "disk": "Disk",
3140
+ "validators": "Validator stacks",
3141
+ "name": "Name",
3142
+ "image": "Image",
3143
+ "status": "Status",
3144
+ "ports": "Ports",
3145
+ "managed": "Managed",
3146
+ "size": "Size",
3147
+ "driver": "Driver",
3148
+ "type": "Type",
3149
+ "reclaimable": "Reclaimable"
3150
+ },
3151
+ "state": {
3152
+ "up": "Active",
3153
+ "down": "Stopped",
3154
+ "running": "Running",
3155
+ "exited": "Exited",
3156
+ "restarting": "Restarting",
3157
+ "restartingCount": "Restarting · {{n}} times",
3158
+ "paused": "Paused",
3159
+ "created": "Created",
3160
+ "dead": "Dead",
3161
+ "removing": "Removing",
3162
+ "unknown": "Unknown"
3163
+ },
3164
+ "df": {
3165
+ "images": "Images",
3166
+ "containers": "Containers",
3167
+ "volumes": "Local volumes",
3168
+ "builder": "Build cache",
3169
+ "other": "Other"
3170
+ },
3171
+ "actions": {
3172
+ "start": "Start",
3173
+ "stop": "Stop",
3174
+ "restart": "Restart",
3175
+ "remove": "Remove",
3176
+ "logs": "Logs",
3177
+ "inspect": "Inspect",
3178
+ "exec": "Exec (version)",
3179
+ "run": "Run image",
3180
+ "pull": "Pull",
3181
+ "up": "Up",
3182
+ "down": "Down",
3183
+ "createVolume": "Create volume",
3184
+ "createNetwork": "Create network",
3185
+ "pruneContainers": "Prune containers",
3186
+ "pruneImages": "Prune images",
3187
+ "pruneVolumes": "Prune volumes",
3188
+ "pruneSystem": "System prune",
3189
+ "startEngine": "Start engine",
3190
+ "stopEngine": "Stop engine",
3191
+ "restartEngine": "Restart engine",
3192
+ "applyDaemon": "Apply daemon settings"
3193
+ },
3194
+ "empty": {
3195
+ "containers": "No containers",
3196
+ "images": "No images",
3197
+ "compose": "No Compose projects",
3198
+ "composeDesc": "Projects come from validator nodes or Compose files already on this host. This page does not accept arbitrary YAML uploads.",
3199
+ "composeCta": "Open validator nodes",
3200
+ "volumes": "No volumes",
3201
+ "networks": "No networks"
3202
+ },
3203
+ "logs": {
3204
+ "empty": "No log output.",
3205
+ "follow": "Follow"
3206
+ },
3207
+ "deleteRunningWarn": "This container is still running or restarting. It will be force-removed.",
3208
+ "settings": {
3209
+ "logMaxSize": "Container log max size",
3210
+ "liveRestore": "Live restore (keep containers if the daemon restarts)",
3211
+ "mirrors": "Registry mirrors (one URL per line)",
3212
+ "insecure": "Insecure registries (one host per line)"
3213
+ },
3214
+ "about": {
3215
+ "body": "Docker is a first-class host service on YSK Server, like Nginx. Install via the panel (Ubuntu docker.io + docker-compose-v2). Validator nodes run as Compose projects named yskval-*.",
3216
+ "honesty": "Host changes need root and YSK_EXECUTE=1. Dry-run is the default. This page manages Docker on one host; use external Kubernetes for cluster orchestration.",
3217
+ "validators": "Open validator nodes"
3218
+ },
3219
+ "alerts": {
3220
+ "daemonTitle": "Docker daemon is down",
3221
+ "daemonBody": "The Docker engine is installed but docker.service is not active. Validator stacks cannot start."
3222
+ },
3223
+ "errors": {
3224
+ "notInstalled": "Docker is not installed",
3225
+ "daemonDown": "Docker daemon is not active",
3226
+ "needCompose": "docker compose (v2 plugin) is required",
3227
+ "badImage": "Invalid image reference",
3228
+ "badName": "Invalid name",
3229
+ "badPort": "Invalid port publish",
3230
+ "badEnv": "Invalid environment variable",
3231
+ "badVolume": "Invalid volume mount",
3232
+ "badNetwork": "Invalid network",
3233
+ "protectedNetwork": "Cannot remove a built-in Docker network",
3234
+ "badRestart": "Invalid restart policy",
3235
+ "badPrune": "Invalid prune scope",
3236
+ "needPruneConfirm": "Volume or system prune requires confirm=PRUNE",
3237
+ "badDaemon": "Invalid daemon setting",
3238
+ "composeMissing": "Compose file for this project was not found",
3239
+ "logsFailed": "Could not read container logs",
3240
+ "mutateFailed": "Docker command failed",
3241
+ "engineFailed": "Could not control docker.service",
3242
+ "badExec": "Exec is limited to allowlisted binaries and presets (no shell, no TTY)",
3243
+ "uninstallBusy": "Stop YSK-managed containers (including validator stacks) before uninstalling Docker"
3244
+ },
3245
+ "notes": {
3246
+ "dryMutate": "Dry-run only. Pass --execute and YSK_EXECUTE=1 to change the host.",
3247
+ "dryPrune": "Prune preview (not applied).",
3248
+ "dryEngine": "Engine control is dry-run.",
3249
+ "dryDaemon": "Would write /etc/docker/daemon.json and restart docker.service.",
3250
+ "daemonWrote": "Wrote daemon.json",
3251
+ "start": "Container started",
3252
+ "stop": "Container stopped",
3253
+ "restart": "Container restarted",
3254
+ "remove": "Container removed",
3255
+ "ran": "Container started from image",
3256
+ "pulled": "Image pulled",
3257
+ "exec": "Ran allowlisted exec",
3258
+ "imageRemoved": "Image removed",
3259
+ "volumeCreated": "Volume created",
3260
+ "volumeRemoved": "Volume removed",
3261
+ "networkCreated": "Network created",
3262
+ "networkRemoved": "Network removed",
3263
+ "pruned": "Prune finished",
3264
+ "compose": {
3265
+ "up": "Compose project started",
3266
+ "down": "Compose project stopped",
3267
+ "restart": "Compose project restarted",
3268
+ "rm": "Compose project removed"
3269
+ },
3270
+ "engine": {
3271
+ "start": "docker.service started",
3272
+ "stop": "docker.service stopped",
3273
+ "restart": "docker.service restarted"
3274
+ }
3275
+ },
3276
+ "ui": {
3277
+ "whatYouGet": "What this page does",
3278
+ "whatYouGetLead": "Install Docker Engine once. After that you can run a single container, pull images, and see validator Compose stacks that already live on this host.",
3279
+ "capEngine": "Engine",
3280
+ "capEngineDesc": "One-click install of docker.io and docker-compose-v2. Start and stop docker.service here.",
3281
+ "capWork": "Containers and images",
3282
+ "capWorkDesc": "Pick a common image, pull it, run it, then read logs or inspect the container.",
3283
+ "capStacks": "Validator stacks",
3284
+ "capStacksDesc": "Multi-service stacks are validator Compose projects (yskval-*). This page does not accept YAML uploads.",
3285
+ "cardEngine": "Engine",
3286
+ "cardDisk": "Disk",
3287
+ "cardWork": "On this host",
3288
+ "compose": "Compose",
3289
+ "cgroup": "cgroup",
3290
+ "used": "Used",
3291
+ "free": "Free",
3292
+ "running": "Running",
3293
+ "images": "Images",
3294
+ "volumes": "Volumes",
3295
+ "networks": "Networks",
3296
+ "goImages": "Images",
3297
+ "goValidators": "Validator nodes",
3298
+ "imagePickHint": "Choose a common image. Use Other only when you need a different reference.",
3299
+ "imageCustom": "Other",
3300
+ "driver": "Driver",
3301
+ "driverLocalOnly": "This panel creates local volumes only.",
3302
+ "netDefaultDriver": "New networks use Docker’s default bridge driver.",
3303
+ "pruneWhat": "What to remove",
3304
+ "pruneAck": "I understand unused data will be deleted and cannot be restored",
3305
+ "pruneAckDesc": "Volume and system prune cannot be undone. Stopped containers and unused images are removed for the selected scope.",
3306
+ "pruneNow": "Prune now",
3307
+ "useMirrors": "Use registry mirrors",
3308
+ "useInsecure": "Allow insecure registries",
3309
+ "publishPorts": "Publish ports to the host",
3310
+ "attachVolume": "Attach a volume",
3311
+ "setEnv": "Set environment variables",
3312
+ "defaultNet": "Default",
3313
+ "mountPath": "Mount path",
3314
+ "restartNo": "Never",
3315
+ "restartUnless": "Unless stopped",
3316
+ "restartAlways": "Always",
3317
+ "restartOnFail": "On failure",
3318
+ "needAck": "Confirm before pruning",
3319
+ "scopeContainers": "Stopped containers",
3320
+ "scopeImages": "Unused images",
3321
+ "scopeVolumes": "Unused volumes",
3322
+ "scopeBuilder": "Build cache",
3323
+ "scopeSystem": "Everything unused",
3324
+ "noVolumesYet": "No volumes yet — create one on the Volumes tab first.",
3325
+ "customPort": "Another host port",
3326
+ "customPortHost": "Host port",
3327
+ "customPortContainer": "Container port",
3328
+ "pctUsed": "{{n}}% used",
3329
+ "customPortHint": "1–65535. Example: 9090 → 80.",
3330
+ "pickBridge": "Bridge network"
3331
+ },
3332
+ "deleteTitle": "Delete {{id}}",
3333
+ "deleteDesc": "This cannot be undone.",
3334
+ "deleteC1": "The resource is removed from this host.",
3335
+ "deleteComposeVal": "This is a validator stack — the validator instance is also deleted.",
3336
+ "pruneTitle": "Prune Docker resources",
3337
+ "pruneDesc": "Type PRUNE to confirm. Unused data cannot be restored.",
3338
+ "pruneC1": "Unused resources in the selected scope are deleted.",
3339
+ "pruneC2": "Volume and system prune permanently delete unused data volumes.",
3340
+ "pruneC3": "Stopped containers or unused images in this scope are removed."
2765
3341
  },
2766
3342
  "email": {
2767
3343
  "title": "Email",
@@ -2806,13 +3382,16 @@
2806
3382
  "webmailMovedHint": "Webmail is configured globally (not per domain).",
2807
3383
  "openGlobalWebmailSettings": "Open webmail settings",
2808
3384
  "domainsTitle": "Domains ({{filtered}}/{{total}})",
3385
+ "domainsListDesc": "Mail domains registered on this host",
2809
3386
  "emptyFilterHint": "No domains match the search",
2810
3387
  "emptyCreateHint": "Use Create in the toolbar to register a domain;",
2811
3388
  "queueLocalTitle": "Mail queue",
2812
3389
  "needExecute": "Needs YSK_EXECUTE",
2813
3390
  "viewQueue": "View queue",
2814
3391
  "flushQueue": "Flush queue",
2815
- "queueHint": "Click View queue to read the local Postfix queue",
3392
+ "flushQueueEmpty": "Queue is empty",
3393
+ "flushQueueNeedExecute": "Flushing the queue needs YSK_EXECUTE (host execute permission)",
3394
+ "queueHint": "Local Postfix queue. Viewing is a read probe; flush needs YSK_EXECUTE.",
2816
3395
  "deleteThisId": "Delete this ID",
2817
3396
  "queueEmpty": "No deferred mail",
2818
3397
  "queueEmptyHint": "No deferred messages",
@@ -2834,7 +3413,8 @@
2834
3413
  "opsHost": "Host provider: PTR, Port 25 outbound policy",
2835
3414
  "opsRegistrar": "Registrar: publish MX / SPF / DKIM / DMARC",
2836
3415
  "statusTitle": "Status",
2837
- "statusDraft": "draft: panel only",
3416
+ "statusDraft": "Draft (panel only)",
3417
+ "deliverabilityChecks": "Checks",
2838
3418
  "statusWritten": "written: management files written, may not be live",
2839
3419
  "statusApplied": "applied: successfully applied before (still check service is-active)",
2840
3420
  "statusReputation": "Inbox reputation can never be 100% automated",
@@ -2870,6 +3450,14 @@
2870
3450
  "copyAllRecords": "Copy all records",
2871
3451
  "openDnsPage": "Open DNS page",
2872
3452
  "healthScore": "Health score",
3453
+ "healthUnchecked": "Not checked yet",
3454
+ "healthUncheckedHint": "Live DNS / PTR / port 25 have not been probed yet.",
3455
+ "deliverabilityScore": "Deliverability pack",
3456
+ "opendkimNoReload": "OpenDKIM has no reload — use restart after key or table changes.",
3457
+ "opendkimNoReloadTitle": "systemctl reload opendkim is not supported on this stack",
3458
+ "healthChecklist": "Checklist {{score}}/100",
3459
+ "healthChecklistHint": "Checklist score — live DNS / PTR / port 25 not probed yet",
3460
+ "healthLiveHint": "Live probe score",
2873
3461
  "suggestedRecords": "Suggested records",
2874
3462
  "externalTodosCount": "External todos",
2875
3463
  "colType": "Type",
@@ -2954,7 +3542,7 @@
2954
3542
  "hourlyMsgCap": "Hourly message cap",
2955
3543
  "hourlyMsgCapHint": "Global uses the minimum across domains",
2956
3544
  "enableAntispam": "Enable antispam mark (Rspamd multimap)",
2957
- "enableAntispamDesc": "Off marks domain antispam off",
3545
+ "enableAntispamDesc": "Off keeps this domain out of the Rspamd antispam map. Write panel first, then apply to system.",
2958
3546
  "writeControlOnly": "Write panel only",
2959
3547
  "applyToSystemBtn": "Apply to system",
2960
3548
  "dnsblResult": "DNSBL result",
@@ -3079,6 +3667,7 @@
3079
3667
  "health": {
3080
3668
  "dnsUnconfirmed": "DNS records (MX/SPF/DKIM) not yet confirmed",
3081
3669
  "dmarcMissing": "DMARC missing — strongly recommended",
3670
+ "dmarcUnpublished": "DMARC is generated in the panel but not published in public DNS yet",
3082
3671
  "ptrBad": "PTR reverse DNS missing or incorrect — request at VPS provider",
3083
3672
  "port25Blocked": "Outbound Port 25 appears blocked — request unblock or use SMTP relay",
3084
3673
  "port25Unknown": "Port 25 status unknown — run connectivity check"
@@ -3122,7 +3711,8 @@
3122
3711
  "postfixReloaded": "Postfix reloaded.",
3123
3712
  "postfixReloadFailed": "Postfix reload failed: {{detail}}",
3124
3713
  "dovecotApplied": "Wrote Dovecot TLS snippet and attempted reload.",
3125
- "dovecotSkipped": "Skipped Dovecot (not installed or doveconf unavailable)."
3714
+ "dovecotSkipped": "Skipped Dovecot (not installed or doveconf unavailable).",
3715
+ "dovecotSslOmitted": "Mail certificate is missing; wrote ssl=no so Dovecot can start without the LE files."
3126
3716
  },
3127
3717
  "policyApplySystemHint": "Check “apply to system” to write Postfix/Rspamd maps and reload;",
3128
3718
  "rateLimitAppliedNote": "Hourly outbound rate and antispam flag applied (when system apply is on).",
@@ -3161,12 +3751,12 @@
3161
3751
  "deliverabilityDesc": "PTR / DNS / port 25 checks",
3162
3752
  "dnsTodosDesc": "Copy then add at your DNS host",
3163
3753
  "deliverabilityHonesty": "Cannot set PTR or unlock port 25 for you",
3164
- "warmupSuggest": "暖身建議",
3165
- "writeSsoSkeleton": "寫入 Roundcube SSO 骨架",
3166
- "rateLimitPerHour": "每小時訊息上限",
3167
- "rateLimitGlobalHint": "全域取各域名最小值",
3168
- "savePolicyWritten": "只寫入控制面",
3169
- "dnsblMultiIp": "IP RBL",
3754
+ "warmupSuggest": "Warm-up suggestions",
3755
+ "writeSsoSkeleton": "Write Roundcube SSO skeleton",
3756
+ "rateLimitPerHour": "Hourly message cap",
3757
+ "rateLimitGlobalHint": "Global cap uses the lowest per-domain limit",
3758
+ "savePolicyWritten": "Written to the control plane only",
3759
+ "dnsblMultiIp": "Multi-IP RBL",
3170
3760
  "webmailTool": "Webmail software",
3171
3761
  "webmailToolRoundcube": "Roundcube (default)",
3172
3762
  "webmailToolSnappy": "SnappyMail (lightweight)",
@@ -3176,6 +3766,9 @@
3176
3766
  "webmailRisk": "Public webmail is risky — enable HTTPS soon.",
3177
3767
  "webmailForceHttps": "Force HTTPS (Roundcube; SSL required)",
3178
3768
  "reinstallWebmail": "Reinstall / upgrade",
3769
+ "installWebmailTitle": "Create the shared webmail project (first install)",
3770
+ "reinstallWebmailTitle": "Rebuild / upgrade the existing webmail project",
3771
+ "reinstallNeedInstall": "Install webmail first",
3179
3772
  "webmailSsoAdvanced": "Advanced · SSO plugin",
3180
3773
  "tlsRoleMail": "mail (IMAP/SMTP)",
3181
3774
  "tlsRoleMailHint": "Mail server hostname",
@@ -3184,6 +3777,7 @@
3184
3777
  "tlsRoleApex": "Apex domain",
3185
3778
  "tlsRoleApexHint": "Web / apex certificate",
3186
3779
  "tlsRequestLe": "Request LE",
3780
+ "tlsRequestLeFor": "Request LE for {{host}}",
3187
3781
  "advancedToolsTitle": "Queue & clients",
3188
3782
  "flushQueueConfirm": "Flush the local MTA queue? This cannot be undone.",
3189
3783
  "mailSslTitleShort": "Certificates & TLS",
@@ -3238,7 +3832,25 @@
3238
3832
  "mailboxEmptyTitle": "No mailboxes yet",
3239
3833
  "passwordMismatch": "Passwords do not match",
3240
3834
  "passwordTooShort": "Password must be at least 8 characters",
3241
- "mailboxUpdateNeedField": "Set a new password or change status"
3835
+ "mailboxUpdateNeedField": "Set a new password or change status",
3836
+ "catchallHint": "Unknown local parts go to the target mailbox. Draft until mail apply.",
3837
+ "queueSearchPh": "Search ID, sender, or recipient…",
3838
+ "queueId": "Queue ID",
3839
+ "queueSender": "Sender",
3840
+ "queueRecipients": "Recipients",
3841
+ "queueSize": "Size",
3842
+ "queueReason": "Reason",
3843
+ "queueActive": "Active",
3844
+ "queueHeld": "Held",
3845
+ "queueDeferred": "Deferred",
3846
+ "deleteQueueTitle": "Delete this queued message?",
3847
+ "deleteQueueDesc": "Remove {{id}} from the local MTA queue. Needs YSK_EXECUTE.",
3848
+ "openQueuePage": "Open mail queue",
3849
+ "dovecotFailedHint": "Dovecot failed. Open the Software tab for the unit status.",
3850
+ "dovecotFailedStatus": "Dovecot is {{status}}. Open the Software tab for the unit summary.",
3851
+ "mailCertMissing": "No certificate for {{hosts}}. Issue it on the SSL page.",
3852
+ "mailCertPresent": "A mail certificate is already issued — this is not a missing-cert problem.",
3853
+ "webmailNeedCert": "No certificate for {{host}} — issue it on SSL before forcing HTTPS."
3242
3854
  },
3243
3855
  "errors": {
3244
3856
  "YSK_UNAUTHORIZED": "Unauthorized",
@@ -3267,7 +3879,7 @@
3267
3879
  "adminTotpStrict": "Admins must enable 2FA (strict). Use an enrolled account or disable strict mode.",
3268
3880
  "totpReplay": "Code already used; wait for the next period",
3269
3881
  "totpRequired": "A valid authentication code is required",
3270
- "mustEnrollTotp": "Admin policy: enable two-factor authentication now",
3882
+ "mustEnrollTotp": "Policy: enable two-factor authentication now",
3271
3883
  "userNotFound": "User not found",
3272
3884
  "totpSetupNeedReauth": "Enabling 2FA requires your password (or a recent step-up code)",
3273
3885
  "totpBeginFirst": "Start 2FA setup first",
@@ -3279,7 +3891,9 @@
3279
3891
  "sessionExpired": "Session expired; sign in again",
3280
3892
  "sessionIdle": "Idle timeout; sign in again",
3281
3893
  "totpNotEnabled": "2FA is not enabled",
3282
- "totpSecretNoDataDir": "TOTP secret is encrypted but dataDir is not set"
3894
+ "totpSecretNoDataDir": "TOTP secret is encrypted but dataDir is not set",
3895
+ "mustChangePassword": "You must set a new password before continuing",
3896
+ "policyNeedsOwn2fa": "Turn on 2FA for this account and confirm with a TOTP code before requiring 2FA for others"
3283
3897
  },
3284
3898
  "http": {
3285
3899
  "notFoundRoute": "Not found: {{method}} {{path}}",
@@ -3289,7 +3903,8 @@
3289
3903
  "unprocessable": "Request rejected by server",
3290
3904
  "requestFailed": "Request failed ({{status}})",
3291
3905
  "jsonInvalid": "Invalid JSON",
3292
- "internal": "Internal error"
3906
+ "internal": "Internal error",
3907
+ "payloadTooLarge": "Request body is too large"
3293
3908
  },
3294
3909
  "YSK_HOST_BROWSE_SSRF": "Host browse blocked by security policy",
3295
3910
  "YSK_HOST_BROWSE_SESSION": "Host browse session not found or expired",
@@ -3306,10 +3921,10 @@
3306
3921
  "startService": "Start service",
3307
3922
  "notInstalled": "fail2ban is not installed",
3308
3923
  "toolHintPrefix": "Underlying tools:",
3309
- "toolHintBody": "fail2ban = after scanning logs,",
3310
- "toolHintTemp": "temporary",
3311
- "toolHintBody2": "bans · for attack response use",
3312
- "toolHintUfw": "UFW = ports / permanent rules",
3924
+ "toolHintBody": "fail2ban temporarily bans after scanning logs. For attack response use",
3925
+ "toolHintTemp": "",
3926
+ "toolHintBody2": "",
3927
+ "toolHintUfw": "handles ports and permanent rules.",
3313
3928
  "tabs": {
3314
3929
  "bans": "Ban list",
3315
3930
  "whitelist": "Whitelist",
@@ -3334,11 +3949,15 @@
3334
3949
  "emptyBansDesc": "Or no permission to read fail2ban-client",
3335
3950
  "ignoreipTitle": "ignoreip whitelist",
3336
3951
  "ignoreipDesc": "IPs never banned (panel file + optional live fail2ban-client)",
3952
+ "whitelistEmptyWarn": "Whitelist is empty while jails can ban you. Add your login IP before applying ignoreip.",
3953
+ "suggestIgnoreLogin": "Your login IP {{ip}}",
3954
+ "applyIgnoreEmptyWarn": "Applying with an empty whitelist clears ignoreip",
3955
+ "applyIgnoreNeedConfirm": "Rewrites jail ignoreip and reloads fail2ban",
3337
3956
  "addIp": "Add IP",
3338
3957
  "addWhitelist": "Add to whitelist",
3339
3958
  "applyPolicyIgnoreip": "Apply policy (incl. ignoreip)",
3340
3959
  "applyIgnoreipOk": "Wrote ignoreip into jail.local and applied",
3341
- "ignoreipHint": "Without YSK_EXECUTE only panel file is written (apply_status=written);",
3960
+ "ignoreipHint": "Without system-change permission only the panel file is written. Apply policy rebuilds jail.local ignoreip and reloads.",
3342
3961
  "whitelistTitle": "Whitelist ({{count}})",
3343
3962
  "whitelistRemoved": "Removed from whitelist",
3344
3963
  "remove": "Remove",
@@ -3376,13 +3995,36 @@
3376
3995
  "reload": "fail2ban reloaded",
3377
3996
  "restart": "fail2ban restarted",
3378
3997
  "stop": "fail2ban stopped"
3379
- }
3998
+ },
3999
+ "statWhitelist": "Whitelist",
4000
+ "invalidIp": "Enter a valid IPv4, IPv6, or CIDR.",
4001
+ "whitelistPendingApply": "Saved to the panel list. Press Apply policy to write jail.local.",
4002
+ "ignoreipFile": "dataDir/fail2ban/ignoreip.txt",
4003
+ "jailsTabHint": "Status of active jails. Turn jails on or off in the Policy tab.",
4004
+ "colJail": "Jail",
4005
+ "colEnabled": "On",
4006
+ "serviceStateLine": "Unit {{unit}} · {{state}} · boot {{boot}}",
4007
+ "jail": {
4008
+ "sshd": "SSH brute-force",
4009
+ "nginxHttpAuth": "Nginx HTTP authentication",
4010
+ "nginxBotsearch": "Nginx scanner / bot probes",
4011
+ "nginxBadbots": "Nginx known bad bots",
4012
+ "nginxLimitReq": "Nginx rate-limit jail",
4013
+ "postfix": "Postfix mail brute-force",
4014
+ "dovecot": "Dovecot mail login",
4015
+ "recidive": "Repeat offenders"
4016
+ },
4017
+ "cannotBanSelf": "This is the host or your login IP — add it to ignoreip instead of banning",
4018
+ "suggestIgnoreHint": "Suggested admin IPs (panel file only until you apply policy):",
4019
+ "suggestIgnoreAdd": "Add {{ip}}"
3380
4020
  },
3381
4021
  "featurePage": {
3382
4022
  "back": "Back"
3383
4023
  },
3384
4024
  "files": {
3385
4025
  "pillFiles": "{{count}} files",
4026
+ "pillTrash": "{{count}} in trash",
4027
+ "pillSpace": "{{used}} used",
3386
4028
  "statFiles": "Files",
3387
4029
  "statFolders": "Folders",
3388
4030
  "statUsage": "Usage",
@@ -3441,10 +4083,14 @@
3441
4083
  "selectAllAria": "Select all",
3442
4084
  "selectAll": "Select all",
3443
4085
  "folder": "Folder",
4086
+ "dirNamedLikeFile": "(folder leftover; name looks like a file)",
3444
4087
  "dropToUpload": "Drop to upload",
3445
4088
  "trashTitle": "Trash ({{count}})",
3446
4089
  "trashDesc": "Deleted files can be restored or permanently removed",
3447
4090
  "emptyTrash": "Empty trash",
4091
+ "emptyTrashTitle": "Empty trash?",
4092
+ "emptyTrashDesc": "Every file in trash will be permanently deleted. This cannot be undone.",
4093
+ "purgeForeverDesc": "This file will be permanently deleted. This cannot be undone.",
3448
4094
  "emptyTrashDone": "Trash emptied",
3449
4095
  "colOrigPath": "Original path",
3450
4096
  "colDeletedAt": "Deleted at",
@@ -3472,12 +4118,15 @@
3472
4118
  "enabledMount": "Enabled · {{path}}",
3473
4119
  "notEnabled": "Not enabled",
3474
4120
  "disable": "Disable",
4121
+ "webdavAlreadyOff": "WebDAV is already off",
3475
4122
  "webdavDisabled": "WebDAV disabled",
3476
4123
  "webdavEnabledNoEcho": "Enabled (password will not be shown again; re-issue if needed)",
3477
4124
  "webdavDefaultOff": "Off by default — click Enable and issue token to start",
4125
+ "webdavAfterEnable": "Available after you enable WebDAV and issue a token.",
3478
4126
  "webdavOn": "Enabled",
3479
4127
  "webdavOff": "Disabled",
3480
4128
  "webdavTokenId": "Token #{{id}}",
4129
+ "webdavTokenInactive": "Disabled — token #{{id}} is not active",
3481
4130
  "webdavUpdated": "Updated {{at}}",
3482
4131
  "webdavTokenOnceTitle": "Copy the password now",
3483
4132
  "webdavTokenOnceHint": "This password is shown only once; it cannot be retrieved after you leave this page.",
@@ -3569,6 +4218,9 @@
3569
4218
  "movedToTrash": "Moved to trash",
3570
4219
  "moveToTrashTitle": "Move to trash?",
3571
4220
  "moveToTrashDesc": "Delete {{count}} item(s) (restorable from trash)",
4221
+ "deleteMore": " and {{n}} more",
4222
+ "unshareTitle": "Revoke this share?",
4223
+ "unshareDesc": "Revoke the link for {{name}} ({{url}}). The link stops working immediately.",
3572
4224
  "preview": "Preview",
3573
4225
  "imagePreviewNeedLogin": "Image preview needs login; use download instead",
3574
4226
  "pdfDownloadHint": "Download PDF to open (needs auth headers)",
@@ -3699,7 +4351,37 @@
3699
4351
  "publicShareBtFailed": "WebTorrent failed: {{detail}}",
3700
4352
  "publicShareBtNeedMagnet": "No magnet URI for this share",
3701
4353
  "publicShareBtUnsupported": "This browser cannot run WebTorrent; use magnet or .torrent instead",
3702
- "btNone": "—"
4354
+ "btNone": "—",
4355
+ "uploadStatusSkipped": "Skipped",
4356
+ "uploadStatusCancelled": "Cancelled",
4357
+ "conflict": {
4358
+ "titleFile": "An item named “{{name}}” already exists",
4359
+ "titleFolder": "A folder named “{{name}}” already exists",
4360
+ "descFile": "Choose what to do. Nothing is overwritten until you pick Replace.",
4361
+ "descFolder": "Choose what to do. Merge keeps the existing folder and continues with its contents.",
4362
+ "incoming": "Incoming",
4363
+ "existing": "Already here",
4364
+ "kindFile": "File",
4365
+ "kindFolder": "Folder",
4366
+ "skip": "Skip",
4367
+ "skipHint": "Do not add this item",
4368
+ "keepBoth": "Keep both",
4369
+ "keepBothHint": "Save incoming as {{name}}",
4370
+ "replace": "Replace",
4371
+ "replaceHint": "Overwrite the existing file. A version snapshot is kept when possible.",
4372
+ "replaceFolderHint": "Overwrite files with the same names inside this folder. Other files stay.",
4373
+ "merge": "Merge",
4374
+ "mergeHint": "Keep the existing folder and add incoming files into it",
4375
+ "applyAll": "Apply to all remaining conflicts",
4376
+ "applyAllHint": "Use this action for the rest of this drop or transfer",
4377
+ "cancelRest": "Cancel remaining",
4378
+ "progress": "{{current}} of {{total}}",
4379
+ "typeMismatch": "A {{destKind}} named “{{name}}” is already here. Incoming is a {{incomingKind}}.",
4380
+ "skipped": "Skipped",
4381
+ "cancelled": "Cancelled"
4382
+ },
4383
+ "webdavReissueUnchanged": "Token id did not change after re-issue — the write may not have persisted. Try again.",
4384
+ "webdavDisableFailed": "WebDAV is still enabled after disable — the write may not have persisted. Try again."
3703
4385
  },
3704
4386
  "firewall": {
3705
4387
  "profiles": {
@@ -3723,6 +4405,8 @@
3723
4405
  "statAllow": "Allow",
3724
4406
  "statDeny": "Deny",
3725
4407
  "statDefaultIn": "Default incoming",
4408
+ "defaultNotApplied": "n/a (UFW off)",
4409
+ "ufwOffHint": "Default incoming is not applied while UFW is off",
3726
4410
  "executeOn": "On",
3727
4411
  "executeOff": "Off",
3728
4412
  "ufwDisabled": "UFW disabled",
@@ -3732,6 +4416,7 @@
3732
4416
  "notInstalled": "UFW is not installed",
3733
4417
  "toolHintPrefix": "Underlying tools:",
3734
4418
  "toolHintBody": "UFW = ports / permanent rules · for attack response and auto-ban use",
4419
+ "toolHintfail2ban": "fail2ban = temporary log-based bans",
3735
4420
  "toolHintFail2ban": "fail2ban = temporary log-based bans",
3736
4421
  "executeOffHint": "System changes off — status is readable;",
3737
4422
  "tabs": {
@@ -3792,6 +4477,7 @@
3792
4477
  "deleteRuleDesc": "Removes that UFW rule number (needs system-change permission).",
3793
4478
  "servicesTitle": "Managed services",
3794
4479
  "servicesHint": "Desired network exposure for YSK services. Opening a service syncs these rules automatically.",
4480
+ "servicesUfwOff": "UFW is off. This list is the desired exposure, not rules the host is enforcing.",
3795
4481
  "servicesEmpty": "No service exposure data yet",
3796
4482
  "servicesEmptyDesc": "Start a managed service (web, FTPS, VPN, DB…) to populate this list.",
3797
4483
  "servicesManualHint": "Manual port chips are under the Ports tab — prefer managing access here so rules stay tagged (ysk-svc).",
@@ -3801,7 +4487,12 @@
3801
4487
  "colPorts": "Ports",
3802
4488
  "colSync": "Status",
3803
4489
  "synced": "Synced",
3804
- "syncNow": "Sync"
4490
+ "syncNow": "Sync",
4491
+ "disableConfirmTitle": "Disable UFW?",
4492
+ "disableConfirmDesc": "The host firewall will stop filtering traffic. SSH and the panel can be exposed if the host is on a public network.",
4493
+ "disableConfirmConsequence": "Existing allow/deny rules stay stored but are not enforced until UFW is enabled again.",
4494
+ "desiredOnlyUfwOff": "Desired: {{mode}} · UFW off (not applied)",
4495
+ "syncNotApplied": "UFW off · not applied"
3805
4496
  },
3806
4497
  "ftp": {
3807
4498
  "title": "FTPS accounts",
@@ -3866,7 +4557,13 @@
3866
4557
  "listenPortHint": "Default 21; open firewall if using another port",
3867
4558
  "customPort": "Custom port",
3868
4559
  "ipStack": "IP stack",
3869
- "ipStackHint": "Most vsftpd builds: listen and listen_ipv6 are mutually exclusive;",
4560
+ "ipStackHint": "Most vsftpd builds: listen and listen_ipv6 are mutually exclusive.",
4561
+ "listenConflictLive": "Live vsftpd.conf has listen={{v4}} and listen_ipv6={{v6}} — both YES will fail to start.",
4562
+ "listenConflictNeedFix": "Fix listen / listen_ipv6 first (they cannot both be YES), then apply.",
4563
+ "fixListenIpv4": "Use IPv4 only (listen=YES, listen_ipv6=NO)",
4564
+ "liveFileValue": "File now: {{value}}",
4565
+ "startBlockedFailed": "Service is failed — apply a valid config before start",
4566
+ "ftpsNeedCert": "Pick a certificate domain first",
3870
4567
  "ipv4Only": "IPv4 only",
3871
4568
  "ipv6Mapped": "IPv6 (mapped OK)",
3872
4569
  "bannerHint": "Welcome string clients see after connect",
@@ -3878,7 +4575,10 @@
3878
4575
  "openFirewallPage": "Open firewall page",
3879
4576
  "customEnd": "Custom end",
3880
4577
  "pasvPublicIp": "PASV public IP",
4578
+ "detectPublicIp": "Detect public IP",
4579
+ "detectPublicIpTitle": "Fill the first non-loopback IPv4 from this host",
3881
4580
  "pasvPublicIpHint": "NAT/cloud: set public IP; local can leave empty",
4581
+ "pasvIpRequired": "Set a public PASV IP before apply (NAT/cloud). Detect or type an address.",
3882
4582
  "optionalEmpty": "(optional)",
3883
4583
  "securityTitle": "Security settings",
3884
4584
  "securityDesc": "TLS, write access, chroot; Apply and restart to take effect",
@@ -3900,7 +4600,7 @@
3900
4600
  "opsResult": "Ops result",
3901
4601
  "saved": "Saved",
3902
4602
  "accountsList": "Account list",
3903
- "accountsListDesc": "After create, Apply to sync vsftpd. If service missing, install above then ",
4603
+ "accountsListDesc": "After create, Apply to sync vsftpd. If it is not installed, use the Software tab.",
3904
4604
  "startService": " start.",
3905
4605
  "createAccountPlus": "+ Create account",
3906
4606
  "noFtpAccounts": "No FTP accounts yet",
@@ -3936,7 +4636,13 @@
3936
4636
  "sftpRegister": "Register key",
3937
4637
  "sftpAddedAt": "Added {{time}}",
3938
4638
  "sftpTechSummary": "Technical details (advanced)",
3939
- "sftpTechNote": "Keys are written under the managed path"
4639
+ "sftpTechNote": "Keys are written under the managed path",
4640
+ "filterProject": "Showing FTP accounts for this project",
4641
+ "clearProjectFilter": "Show all accounts",
4642
+ "vsftpdFailedHint": "vsftpd failed. Open the Service tab (listen and listen_ipv6 cannot both be YES).",
4643
+ "vsftpdFailedGeneric": "vsftpd failed. Open the Service tab for live settings and journal.",
4644
+ "stateFailed": "Failed to start",
4645
+ "tabService": "Service"
3940
4646
  },
3941
4647
  "geo": {
3942
4648
  "continents": {
@@ -4109,6 +4815,7 @@
4109
4815
  "viaHost": "via host",
4110
4816
  "emptyTitle": "Host-mediated browse",
4111
4817
  "emptyBody": "Enter a URL. DNS, TLS, and egress use this server — not your browser. Cookies stay in a server-side jar.",
4818
+ "needUrl": "Enter a URL above to start a session.",
4112
4819
  "ssrfBlocked": "Blocked by security policy (SSRF / mode)",
4113
4820
  "loadFailed": "Fetch failed on host",
4114
4821
  "sessionReady": "Session ready",
@@ -4127,12 +4834,15 @@
4127
4834
  "engineBrowser": "Real browser",
4128
4835
  "engineSwitchHint": "Switching engine opens a new session.",
4129
4836
  "needChrome": "Real browser needs system Chrome/Chromium (or set YSK_HOST_BROWSE_CHROME). Using proxy otherwise.",
4837
+ "engineBrowserNeedChrome": "Real browser (Chrome not installed)",
4838
+ "egressHint": "The target site sees this server’s outbound address ({{host}}), not your laptop. Cookies stay in the server session jar.",
4130
4839
  "needChromeFallback": "Chrome unavailable — switched to proxy engine.",
4131
4840
  "liveError": "Live stream failed",
4132
4841
  "liveWaiting": "Connecting host browser…",
4133
4842
  "tabSettings": "Settings",
4134
4843
  "softwareNeeded": "Chromium / Chrome required for real browser engine",
4135
- "softwareHint": "One-click installs distro Chromium via apt. Google Chrome binary is also detected if already present. Requires root + YSK_EXECUTE=1.",
4844
+ "softwareHint": "One-click installs distro Chromium via apt. Google Chrome is also detected if already present. Needs superuser and system-change permission.",
4845
+ "closeNoSession": "No session yet",
4136
4846
  "goInstallChrome": "Open Software tab",
4137
4847
  "settingsIntro": "These panel settings override process environment variables for Host Browse.",
4138
4848
  "settingsEngine": "Default engine",
@@ -4173,6 +4883,8 @@
4173
4883
  },
4174
4884
  "home": "Home",
4175
4885
  "bookmark": "Bookmark",
4886
+ "bookmarkAdd": "Add or remove bookmark",
4887
+ "bookmarkList": "Bookmark list",
4176
4888
  "bookmarks": "Bookmarks",
4177
4889
  "history": "History",
4178
4890
  "bookmarkToggled": "Bookmark updated",
@@ -4181,6 +4893,7 @@
4181
4893
  "mediaNote": "Real browser: video is streamed into the panel. Enable audio bridge in Settings to hear page audio (requires user gesture).",
4182
4894
  "isolationNote": "Real browser creates an ephemeral Linux user for Chrome; leaving the page or idle timeout destroys that user.",
4183
4895
  "resumeHint": "Resume previous session ({{count}} tabs)",
4896
+ "resumeHintDetail": "Resume previous session ({{count}} tabs) · {{url}} · {{when}}",
4184
4897
  "resume": "Resume",
4185
4898
  "resumeDismiss": "Dismiss",
4186
4899
  "resumeDone": "Session resumed",
@@ -4215,7 +4928,20 @@
4215
4928
  "mediaAudioLabel": "Audio",
4216
4929
  "mediaAudioDesc": "Optional bridge from host Chrome; may require unlock click.",
4217
4930
  "mediaPolicyLabel": "Policy",
4218
- "mediaPolicyDesc": "Downloads and autoplay follow the safety and download settings above."
4931
+ "mediaPolicyDesc": "Downloads and autoplay follow the safety and download settings above.",
4932
+ "frameBlocked": "The page could not be shown in the panel frame.",
4933
+ "historyEmpty": "No history in this session.",
4934
+ "bookmarksEmpty": "No bookmarks yet.",
4935
+ "closeSessionHint": "Clears cookies for this browse session. Bookmarks stay.",
4936
+ "envUnset": "not set",
4937
+ "envPanelValue": "panel: {{value}}",
4938
+ "envColVar": "Variable",
4939
+ "envColHost": "Host process",
4940
+ "envColPanel": "Panel setting",
4941
+ "envColEffective": "Effective",
4942
+ "settingsNoSandboxWarn": "Disables Chromium sandbox. Use only inside a trusted container. Applies on next real-browser session.",
4943
+ "settingsDangerDlWarn": "Allows executable and script downloads through the host browser. Confirm you need this.",
4944
+ "settingsDangerConfirmTitle": "Enable a high-risk browse setting?"
4219
4945
  },
4220
4946
  "listToolbar": {
4221
4947
  "searchPlaceholder": "Search…",
@@ -4227,7 +4953,8 @@
4227
4953
  "activeFilters": "{{count}} filters active",
4228
4954
  "noResults": "No matches",
4229
4955
  "noResultsHint": "Try another keyword or clear filters.",
4230
- "searching": "Searching…"
4956
+ "searching": "Searching…",
4957
+ "emptyChip": "No items in this filter"
4231
4958
  },
4232
4959
  "logViewer": {
4233
4960
  "banIpTitle": "Ban {{ip}} in Protection"
@@ -4244,7 +4971,12 @@
4244
4971
  "totpLabel": "Authentication code",
4245
4972
  "totpHint": "6-digit code from your authenticator app",
4246
4973
  "submitting": "Signing in…",
4247
- "sessionExpired": "Session expired; sign in again"
4974
+ "sessionExpired": "Session expired; sign in again",
4975
+ "newPassword": "New password",
4976
+ "newPasswordAgain": "Confirm new password",
4977
+ "changePassword": "Change password",
4978
+ "passwordMismatch": "The two passwords do not match",
4979
+ "passwordChanged": "Password updated"
4248
4980
  },
4249
4981
  "logs": {
4250
4982
  "catSystem": "System files",
@@ -4293,6 +5025,9 @@
4293
5025
  "followingSse": " · following (SSE)",
4294
5026
  "loadingSources": "Loading sources…",
4295
5027
  "pickSource": "Pick a source on the left, or a shortcut · then Query",
5028
+ "noRowsInWindow": "No records in this time window",
5029
+ "showInactiveUnits": "Show inactive units",
5030
+ "sseNeedFollow": "Turn on Follow first — SSE is only for live tail",
4296
5031
  "maintOverview": "Maintenance overview",
4297
5032
  "executable": "Executable",
4298
5033
  "restricted": "Restricted",
@@ -4356,8 +5091,11 @@
4356
5091
  "lines": "{{n}} lines",
4357
5092
  "followingSseDyn": " · following{{sse}}",
4358
5093
  "ipBan": "IP → ban",
4359
- "vacuumNote": "Free systemd-journal disk. No EXECUTE blocked, no fake success.",
4360
- "vacuumTime": "Vacuum time",
5094
+ "vacuumNote": "Reclaims systemd-journald disk. Without execute permission the action is blocked it is not treated as success.",
5095
+ "vacuumTime": "Clean by retention",
5096
+ "vacuumNeedRetention": "Enter a retention window first (for example 14d)",
5097
+ "vacuumNeedConfirm": "Needs confirmation — deletes old journal logs",
5098
+ "vacuumSizeNeedConfirm": "Needs confirmation — caps journal disk use",
4361
5099
  "vacuumHint": "Keep ≥7 days recommended; re-probe disk after.",
4362
5100
  "logrotateStatus": "System logrotate status (read-only probe)",
4363
5101
  "logrotateMissing": "No status file or unreadable — check logrotate package in services matrix",
@@ -4365,12 +5103,13 @@
4365
5103
  "relatedOpsDesc": "Log observation vs incident response",
4366
5104
  "scLogsLine": "Observe journal / files / projects",
4367
5105
  "scProtLine": "Incident response, auto ban (click IP)",
4368
- "journalVacuumTitle": "Journal vacuum",
5106
+ "journalVacuumTitle": "Clean journald disk",
4369
5107
  "journalSection": "Journal",
4370
5108
  "sseLabel": "SSE",
4371
5109
  "logrotateLabel": "logrotate",
4372
5110
  "srcNginx": "nginx",
4373
5111
  "srcSsh": "ssh",
5112
+ "srcfail2ban": "fail2ban",
4374
5113
  "srcFail2ban": "fail2ban",
4375
5114
  "srcAuthLog": "auth.log",
4376
5115
  "srcNginxError": "nginx error",
@@ -4379,7 +5118,29 @@
4379
5118
  "groupVarLog": "/var/log",
4380
5119
  "prioErr": "err+",
4381
5120
  "prioWarn": "warn+",
4382
- "prioInfo": "info+"
5121
+ "prioInfo": "info+",
5122
+ "vacuumSize": "Limit to 500 MB",
5123
+ "logrotateNoStatus": "No logrotate status file yet (normal if it has never run).",
5124
+ "autoVacuumOff": "Automatic clean is off. Time is unused until you enable it.",
5125
+ "aboutAllowlist": "Explore can only read allowlisted journal units and /var/log paths. Arbitrary host paths are not offered.",
5126
+ "aboutCustomPath": "Add a custom path on Settings (only /var/log or /run/log). Then open it from Explore.",
5127
+ "vacuumSizeAlreadyBelow": "Current usage already below cap, this will no-op",
5128
+ "vacuumSizeNoopDesc": "Journal is already under 500 MB. This still runs vacuum --size=500M and typically deletes nothing.",
5129
+ "journalDiskHint": "Current systemd-journald usage (active journal). Rotated files under /var/log are not included.",
5130
+ "varLogDiskHint": "Estimated du of /var/log, including rotated files. Approximate.",
5131
+ "queryFirst": "Query first",
5132
+ "errorsWindowHint": "Recent errors from the last overview probe (not live-updating when you switch tabs)",
5133
+ "sourceCount": "{{shown}} shown",
5134
+ "sourceUnavailable": "This source has not produced a log yet",
5135
+ "sourceNoLog": "No log yet",
5136
+ "projectSourcesTitle": "{{n}} source(s) (files + journal)",
5137
+ "logrotatePath": "Path",
5138
+ "logrotateLast": "Last rotated",
5139
+ "exportJsonl": "JSONL export",
5140
+ "sseLive": " (live stream)",
5141
+ "logrotateExpand": "Show {{n}} more",
5142
+ "logrotateCollapse": "Show fewer",
5143
+ "logrotateVersion": "Status version {{v}}"
4383
5144
  },
4384
5145
  "metrics": {
4385
5146
  "alert": {
@@ -4410,6 +5171,15 @@
4410
5171
  "alerts": "Alerts"
4411
5172
  },
4412
5173
  "load": "Load",
5174
+ "load1m": "Load 1m",
5175
+ "uptime": "Uptime",
5176
+ "filterCpu5": "≥5% CPU",
5177
+ "filterMem5": "≥5% memory",
5178
+ "signalHint": "Select a process, then send TERM or KILL.",
5179
+ "signalFromRow": "Select this process for TERM / KILL",
5180
+ "selectForSignal": "Select",
5181
+ "forceKillTitleNamed": "KILL PID {{pid}} ({{cmd}})?",
5182
+ "sendSigTitleNamed": "Send TERM to PID {{pid}} ({{cmd}})?",
4413
5183
  "min1": "1m",
4414
5184
  "min5": "5m",
4415
5185
  "min15": "15m",
@@ -4465,6 +5235,8 @@
4465
5235
  "noProjectsDesc": "Create a project to see real home usage here",
4466
5236
  "usageNote": "Usage from local du (not estimated). Quota is a control-plane soft limit; hard setquota needs apply-to-host.",
4467
5237
  "thresholdAlerts": "Threshold alerts",
5238
+ "alertsBuiltinOnly": "Built-in CPU / memory / disk thresholds only. No email, webhook, or Slack channel.",
5239
+ "lastEvaluated": "Last checked",
4468
5240
  "alertsOkTitle": "All clear",
4469
5241
  "alertsOkDesc": "No memory / load / disk threshold alerts.",
4470
5242
  "cpu": "CPU",
@@ -4481,6 +5253,18 @@
4481
5253
  "selectAllAria": "Select all filtered",
4482
5254
  "selectPidAria": "Select PID {{pid}}",
4483
5255
  "controlPlane": "Control plane",
5256
+ "controlPlaneNoSignal": "The control-plane process cannot be signalled",
5257
+ "protectedPid": "PID 1 / init / systemd cannot be signalled from the panel",
5258
+ "sigTermTitle": "Send SIGTERM (ask process to exit)",
5259
+ "sigKillTitle": "Send SIGKILL (force kill — cannot be caught)",
5260
+ "batchTerm": "TERM",
5261
+ "batchKill": "KILL",
5262
+ "rawTopLabel": "Raw top (untranslated)",
5263
+ "followSseLabel": "Follow (live stream)",
5264
+ "alertsReadOnly": "Built-in CPU / memory / disk thresholds only. No email, webhook, or Slack channel.",
5265
+ "alertsGoNotifications": "Open notification centre",
5266
+ "lastCheck": "Last check",
5267
+ "rawTopHint": "Untranslated top(1) output",
4484
5268
  "detailShort": "Info",
4485
5269
  "procUnavailable": "Could not get processes",
4486
5270
  "noProcData": "No process data yet",
@@ -4499,7 +5283,7 @@
4499
5283
  "reniceHint": "-20 highest · 19 lowest (needs EXECUTE)",
4500
5284
  "noData": "No data",
4501
5285
  "mountsTitle": "Disk mounts ({{count}})",
4502
- "mountsDesc": "Real df -P -B1 (tmpfs filtered)",
5286
+ "mountsDesc": "Real disk usage (temporary filesystems filtered)",
4503
5287
  "noMounts": "No mount list",
4504
5288
  "noMountsDesc": "df unavailable or filtered. Root disk still on Overview.",
4505
5289
  "seeProjectUsage": "Project home usage is on the Project usage tab (real du · {{size}})",
@@ -4511,7 +5295,19 @@
4511
5295
  "usageNoteFull": "Usage from local du (not estimated). Quota is a control-plane soft limit; hard setquota needs apply-to-host.",
4512
5296
  "sseNeedLogin": "Not logged in; cannot open SSE",
4513
5297
  "sseSessionExpired": "Not logged in or session expired; cannot open SSE",
4514
- "sseHttpError": "stream HTTP {{status}}"
5298
+ "sseHttpError": "stream HTTP {{status}}",
5299
+ "colFilesystem": "Filesystem",
5300
+ "colMount": "Mount",
5301
+ "colSize": "Size",
5302
+ "colUsed": "Used",
5303
+ "colAvail": "Available",
5304
+ "colUsePct": "Used %",
5305
+ "colHome": "Home",
5306
+ "usageNoteLink": "Control-plane soft quota. Apply hard limits on the project Isolation tab.",
5307
+ "shareNoQuotaHint": "No quota set, so share is not a percentage. Set a quota on the project Isolation tab.",
5308
+ "setQuotaLink": "Set quota",
5309
+ "unusualHome": "Unusual path",
5310
+ "unusualHomeHint": "Not a /home/… project home. Canonical isolation is /home/ysk-server-{id}."
4515
5311
  },
4516
5312
  "migrate": {
4517
5313
  "tabInventory": "Inventory",
@@ -4525,6 +5321,7 @@
4525
5321
  "subtitle": "Source control plane → full copy to new host. Afterward only change public IP/DNS; accounts, paths, and projects stay the same.",
4526
5322
  "inventorying": "Inventorying",
4527
5323
  "inventoried": "Inventoried",
5324
+ "inventoriedWarn": "Inventoried · {{n}} warnings",
4528
5325
  "inventoryFailed": "Inventory failed",
4529
5326
  "pendingInventory": "Pending inventory",
4530
5327
  "projects": "Projects",
@@ -4553,6 +5350,8 @@
4553
5350
  "authMethod": "Auth method",
4554
5351
  "rootPassword": "Root password",
4555
5352
  "notPersisted": "Not persisted",
5353
+ "passwordNotStored": "Password is used for this SSH session only and is not saved on disk.",
5354
+ "overwriteDanger": "Overwrite will replace existing YSK data on the target. This cannot be undone from the panel.",
4556
5355
  "outboundIdentity": "Outbound identity in vault",
4557
5356
  "dryRun": "Dry-run precheck",
4558
5357
  "startMigrate": "Start full-host migration",
@@ -4581,6 +5380,16 @@
4581
5380
  "restartApiHint": "If you just deployed a new version, restart the API (",
4582
5381
  "afterRestart": ") then Refresh.",
4583
5382
  "inventoryWarnings": "Inventory warnings ({{count}})",
5383
+ "orphanHomesHint": "Leftover project homes (not in the store). Remove only after you confirm they are unused.",
5384
+ "orphanRemove": "Remove leftover home",
5385
+ "orphanRemoveTitle": "Delete leftover project home?",
5386
+ "orphanRemoveDesc": "Permanently delete {{path}} from disk. This is not a store project. Needs superuser and system-change permission.",
5387
+ "orphanRemovePhrase": "Type DELETE to confirm.",
5388
+ "orphanRemoveNeedConfirm": "Needs confirmation",
5389
+ "orphanBackupFirst": "Back up first (open Backups)",
5390
+ "orphanMtime": "Last modified {{at}}",
5391
+ "expandAllWarnings": "Show all {{n}} warnings",
5392
+ "collapseWarnings": "Show fewer",
4584
5393
  "moreWarnings": "…and {{n}} more",
4585
5394
  "authPassword": "root password (switch to key after temp key install)",
4586
5395
  "authIdentity": "SSH identity vault identityId",
@@ -4591,7 +5400,7 @@
4591
5400
  "allowOverwriteDesc": "· Required if target already has ysk.json",
4592
5401
  "dryRunOnly": "Dry-run only",
4593
5402
  "dryRunOnlyDesc": "· Inventory + precheck only; no rsync or target writes",
4594
- "executeNote": "Host needs YSK_EXECUTE=1 and root API. After migrate, update DNS A/AAAA and check cloud firewall + mail PTR.",
5403
+ "executeNote": "Host needs system-change permission and a superuser API. After migrate, update DNS A/AAAA and check cloud firewall + mail PTR.",
4595
5404
  "dnsCutover": "DNS cutover (manual)",
4596
5405
  "dnsCutoverDesc": "Point A/AAAA for these names to the new public IP;"
4597
5406
  },
@@ -4670,7 +5479,9 @@
4670
5479
  "runtimes": "Runtimes",
4671
5480
  "security": "Security",
4672
5481
  "system": "System",
4673
- "ai": "AI"
5482
+ "ai": "AI",
5483
+ "validators": "Validators",
5484
+ "containers": "Containers"
4674
5485
  },
4675
5486
  "java": "Java",
4676
5487
  "kotlin": "Kotlin",
@@ -4690,13 +5501,25 @@
4690
5501
  "bookmarkAdded": "Pinned to sidebar",
4691
5502
  "bookmarkRemoved": "Removed from sidebar",
4692
5503
  "btTracker": "BT Tracker",
4693
- "support": "Support"
5504
+ "support": "Support",
5505
+ "noAccessTitle": "No access",
5506
+ "noAccessDesc": "Your role does not include this page. Ask an admin if you need it.",
5507
+ "backToDashboard": "Back to dashboard",
5508
+ "validators": "Validators (Beta)",
5509
+ "docker": "Docker"
4694
5510
  },
4695
5511
  "network": {
4696
5512
  "title": "Network interfaces",
4697
5513
  "canMutate": "Mutable",
4698
5514
  "readOnlyBlocked": "Read-only / blocked",
4699
5515
  "statIfaces": "Interfaces",
5516
+ "statUp": "Up",
5517
+ "oper": {
5518
+ "up": "Up",
5519
+ "down": "Down",
5520
+ "unknown": "Unknown",
5521
+ "other": "Other"
5522
+ },
4700
5523
  "statGateway": "Gateway",
4701
5524
  "pageActions": "Page actions",
4702
5525
  "loadingSnap": "Loading network snapshot…",
@@ -4729,6 +5552,8 @@
4729
5552
  "defaultDev": "Default egress: {{dev}}",
4730
5553
  "saveNm": "Save (NetworkManager, survives reboot)",
4731
5554
  "ephemeralHint": "Unchecked = live ip route add only",
5555
+ "nmUnavailable": "NetworkManager is not running — only a live route can be added",
5556
+ "defaultRouteDownNeedName": "This is the default route egress. Type the interface name to confirm — the panel may disconnect.",
4732
5557
  "saveRoute": "Save route",
4733
5558
  "dnsSettings": "DNS settings",
4734
5559
  "dnsNmHint": "Writes NM connection “{{conn}}” and reconnects (persistent)",
@@ -4797,9 +5622,17 @@
4797
5622
  "applyDnsNotes": "Apply runs nmcli connection modify + up; brief disconnect is normal. Stub 127.0.0.53 is not written (local resolved).",
4798
5623
  "testResolve": "Test resolve",
4799
5624
  "loadRaw": "Load raw output",
5625
+ "hideRaw": "Hide raw output",
5626
+ "rawLoadedAt": "Loaded {{time}}",
4800
5627
  "confirmDown": "Confirm Down",
5628
+ "linkDownTitle": "Take {{name}} offline",
5629
+ "linkDownNeedConfirm": "Type the interface name to confirm",
4801
5630
  "defaultRouteDownWarn": "This interface is the default route egress; down may cut panel access.",
4802
5631
  "deleteDefaultMayDrop": " — deleting default may drop connectivity.",
5632
+ "deleteDefaultPanelWarn": "Deleting the default route can drop this panel session. Type DEFAULT to confirm.",
5633
+ "deleteDefaultNeedConfirm": "Needs confirmation — type DEFAULT (may drop this panel)",
5634
+ "deleteRouteNeedConfirm": "Needs confirmation",
5635
+ "typeDefaultToConfirm": "Type DEFAULT to confirm",
4803
5636
  "gateway": "Gateway",
4804
5637
  "nameservers": "Nameservers",
4805
5638
  "searchDomains": "Search domains",
@@ -4829,10 +5662,16 @@
4829
5662
  "azure_frontdoor": "Azure Front Door",
4830
5663
  "gcore": "Gcore CDN",
4831
5664
  "custom": "Custom proxies"
4832
- }
5665
+ },
5666
+ "needProvider": "Choose a CDN provider before fetching its IP list.",
5667
+ "spoofWarn": "Trusting the wrong CIDR lets clients spoof X-Forwarded-For / CDN headers as their IP."
4833
5668
  },
4834
5669
  "linkUp": "Up",
4835
- "linkDown": "Down"
5670
+ "linkDown": "Down",
5671
+ "linkDownDefault": "Down default route",
5672
+ "loopbackImmutable": "Loopback cannot be changed",
5673
+ "operUnknownHint": "Kernel did not report UP/DOWN (common for lo). The interface is still usable.",
5674
+ "persistNmHint": "Persistable means changes can survive reboot via NetworkManager."
4836
5675
  },
4837
5676
  "nginx": {
4838
5677
  "pillSites": "{{count}} site(s)",
@@ -4918,6 +5757,12 @@
4918
5757
  "setIndexes": "Directory listing",
4919
5758
  "bodyInherit": "Global"
4920
5759
  },
5760
+ "notFound": {
5761
+ "title": "Page not found",
5762
+ "body": "No panel page at {{path}}.",
5763
+ "hint": "Unknown URLs no longer send you to the dashboard.",
5764
+ "home": "Dashboard"
5765
+ },
4921
5766
  "notes": {
4922
5767
  "notFound": "Not found",
4923
5768
  "needPath": "Specify a path",
@@ -4950,16 +5795,42 @@
4950
5795
  },
4951
5796
  "ssh": {
4952
5797
  "identityNotFound": "Identity not found",
4953
- "registrationNotFound": "Registration not found"
5798
+ "registrationNotFound": "Registration not found",
5799
+ "keyOkNologin": "Key accepted. Account is nologin or SFTP-only (no SSH shell). Treated as PASS.",
5800
+ "keyOkSftp": "SFTP pwd succeeded after SSH shell was refused."
4954
5801
  },
4955
5802
  "cdn": {
4956
5803
  "siteNotFound": "CDN site not found",
4957
- "nodeMissing": "Node does not exist"
5804
+ "nodeMissing": "Node does not exist",
5805
+ "loopbackOriginRemote": "Origin is 127.0.0.1 — that is this host, not a remote edge. Set a reachable origin IP or bind_ip.",
5806
+ "originRemoteRewrite": "Remote edges will use reachable origin {{url}} instead of loopback.",
5807
+ "originRemoteUnknown": "Origin is loopback and no public/LAN IP or bind_ip is known — apply will refuse remote edges until one is set.",
5808
+ "needSshOrFleet": "Remote edge needs an outbound SSH identity (or username) or a /agents fleet session. Health URL alone is not apply transport.",
5809
+ "probe": {
5810
+ "timeout": "Connect timeout after {{ms}}ms ({{detail}}). Peer may be firewalled.",
5811
+ "dns": "DNS lookup failed ({{detail}}).",
5812
+ "refused": "Connection refused after {{ms}}ms ({{detail}}). Port closed or one-way block.",
5813
+ "tls": "TLS verify failed ({{detail}}).",
5814
+ "unreach": "Host unreachable after {{ms}}ms ({{detail}}).",
5815
+ "http": "HTTP probe failed after {{ms}}ms ({{detail}})."
5816
+ }
4958
5817
  },
4959
5818
  "backup": {
5819
+ "testUnsaved": "Testing unsaved form values (not written to settings).",
5820
+ "testIdentity": "sftp (identity) to {{spec}} ok",
5821
+ "sshAuthFailed": "SSH key or password rejected (publickey). Pick an outbound identity or install sshpass.",
5822
+ "remotePathIsFile": "Remote path {{path}} is a file. Use a directory.",
5823
+ "remoteMkdirFailed": "Could not create remote directory: {{detail}}",
5824
+ "sidecarPushed": "Also pushed SQL sidecar {{name}}",
4960
5825
  "fileNotFound": "Backup file not found",
4961
5826
  "resticNoPassword": "restic is enabled but password is not set",
4962
- "resticNotInPath": "restic not in PATH"
5827
+ "resticNotInPath": "restic not in PATH",
5828
+ "dbEnvUnreadable": "Could not read .db.env; skipped SQL dump.",
5829
+ "dbEnvNoName": ".db.env has no database name; skipped SQL dump.",
5830
+ "targetOutside": "Restore target must be inside the project home or the public files root.",
5831
+ "controlPlaneDryRun": "Preview only — nothing written. In the panel, use Restore and confirm the phrase to write.",
5832
+ "controlPlaneNeedConfirm": "Full control-plane restore needs the confirm phrase RESTORE-CONTROL-PLANE.",
5833
+ "controlPlaneRestartAfter": "Restart the API after a successful restore."
4963
5834
  },
4964
5835
  "redis": {
4965
5836
  "cliMissing": "redis-cli is not installed"
@@ -5003,7 +5874,8 @@
5003
5874
  "pathOutsideSandbox": "Path outside sandbox: {{target}}",
5004
5875
  "notFoundRel": "Not found: {{relPath}}",
5005
5876
  "fileNotFoundRel": "File not found: {{relPath}}",
5006
- "notFoundFrom": "Not found: {{fromPath}}"
5877
+ "notFoundFrom": "Not found: {{fromPath}}",
5878
+ "alreadyExists": "Already exists: {{name}}"
5007
5879
  },
5008
5880
  "dns": {
5009
5881
  "needZoneServerIp": "Enter zone and server IP",
@@ -5043,7 +5915,10 @@
5043
5915
  },
5044
5916
  "db": {
5045
5917
  "needExecuteCreate": "Host execute is off; cannot create database from the panel",
5046
- "dryRunMysql": "dry-run: database not created. Use --execute with YSK_EXECUTE=1 to provision"
5918
+ "dryRunMysql": "dry-run: database not created. Use --execute with YSK_EXECUTE=1 to provision",
5919
+ "remoteNoCreds": "No username/password stored — TCP only (registration is not a login).",
5920
+ "remoteReachable": "TCP {{host}}:{{port}} open ({{ms}}ms).",
5921
+ "remoteUnreachable": "TCP {{host}}:{{port}} closed or filtered ({{ms}}ms)."
5047
5922
  },
5048
5923
  "net": {
5049
5924
  "invalidIface": "Invalid interface name",
@@ -5124,7 +5999,17 @@
5124
5999
  "dns": "DNS",
5125
6000
  "email": "Email",
5126
6001
  "isolation": "Project isolation",
5127
- "ops": "Operations"
6002
+ "ops": "Operations",
6003
+ "runtimesNode": "Node.js",
6004
+ "runtimesPhp": "PHP",
6005
+ "runtimesPython": "Python",
6006
+ "runtimesGo": "Go",
6007
+ "pm2": "PM2",
6008
+ "runtimesNodeFix": "Install Node from /runtimes/node",
6009
+ "runtimesPhpFix": "Install PHP from /runtimes/php",
6010
+ "runtimesPythonFix": "Install Python from /runtimes/python",
6011
+ "runtimesGoFix": "Install Go from /runtimes/go",
6012
+ "pm2Fix": "Install PM2 from the Node runtime page"
5128
6013
  },
5129
6014
  "needAdmin": "Administrator permission required",
5130
6015
  "notInstalled": "Not installed",
@@ -5135,6 +6020,44 @@
5135
6020
  "probe": "Probe",
5136
6021
  "install": "Install",
5137
6022
  "port": "Port",
6023
+ "git": {
6024
+ "missingBin": "git is not on PATH",
6025
+ "auth": "Authentication failed. Add a deploy key or HTTPS token.",
6026
+ "hostkey": "SSH host key verification failed. Confirm and pin the host key.",
6027
+ "dirty": "Working tree has {{count}} local change(s). Pull is blocked.",
6028
+ "diverged": "Cannot fast-forward. Reset to the remote ref if you intend to discard local Git history.",
6029
+ "missingRef": "That branch, tag, or commit is not on the remote.",
6030
+ "shallow": "This clone is shallow. Fetch full history before pinning an old commit.",
6031
+ "notRepo": "app/ is not a Git repository yet.",
6032
+ "diffEmpty": "No unstaged diff (protected .env is excluded).",
6033
+ "unrelated": "Unrelated histories. Reclone only after confirm — custom files will be lost.",
6034
+ "lock": "Git index.lock is present. Remove it only if no git process is running.",
6035
+ "disk": "Disk full or quota exceeded.",
6036
+ "timeout": "Git timed out.",
6037
+ "network": "Network error talking to the remote.",
6038
+ "lfs": "This repo uses Git LFS and git-lfs is not available.",
6039
+ "submodule": "Submodule update failed.",
6040
+ "unknown": "Git failed. See the command output.",
6041
+ "fetchOk": "Fetched from origin.",
6042
+ "checkoutOk": "Checked out {{ref}}.",
6043
+ "resetOk": "Reset hard to {{ref}}.",
6044
+ "envRestored": "Restored app/.env from the control plane.",
6045
+ "needPinHost": "SSH host key is not pinned. Scan and pin it before clone or fetch.",
6046
+ "tokenSaved": "HTTPS token stored (never shown again).",
6047
+ "tokenCleared": "HTTPS token removed.",
6048
+ "tokenInvalid": "Token must be at least 8 characters.",
6049
+ "deployKeyCreated": "Deploy key created. Add the public key on the Git host.",
6050
+ "deployKeyCleared": "Deploy key detached from this project.",
6051
+ "hostPinned": "Pinned SSH host keys for {{host}}.",
6052
+ "hostUnpinned": "Cleared pinned SSH host keys.",
6053
+ "hostScanFailed": "ssh-keyscan returned no keys for that host.",
6054
+ "hookEnabled": "Inbound Git hook is on. Paste the URL into GitHub, Gitea, or GitLab yourself.",
6055
+ "hookDisabled": "Inbound Git hook is off. The URL will not sync.",
6056
+ "hookSecretOnce": "Copy this hook secret now. It is not shown again.",
6057
+ "refsNeedUrl": "Enter a Git URL first.",
6058
+ "refsOk": "Loaded {{branches}} branch(es) and {{tags}} tag(s).",
6059
+ "refsEmpty": "Remote advertised no branches or tags."
6060
+ },
5138
6061
  "auto": {
5139
6062
  "n0001": "Status: applied",
5140
6063
  "n0002": "User not found",
@@ -5397,7 +6320,7 @@
5397
6320
  "n0259": "domain",
5398
6321
  "n0260": "domain Not found:",
5399
6322
  "n0261": "dovecot reload failed or servicenot (sieve Wrote; reload Success)",
5400
- "n0262": "dry-run fleet dispatch (not )",
6323
+ "n0262": "dry-run fleet dispatch (not queued)",
5401
6324
  "n0263": "dry-run peer push (not scp)",
5402
6325
  "n0264": "dry-run remote install (not ssh)",
5403
6326
  "n0265": "dry-run transfer done ( full bootstrap)",
@@ -5406,10 +6329,10 @@
5406
6329
  "n0268": "dry-run — not write /etc",
5407
6330
  "n0269": "dry-run: add --execute firstapply ufw",
5408
6331
  "n0270": "dry-run: inventory + preflight passed, not package/transfer",
5409
- "n0271": "dry-run: probe/. add --execute YSK_EXECUTE=1 firstreally provision",
5410
- "n0272": "dry-run: Wrote managed file (dataDir). add execute + YSK_EXECUTE=1 + root firstsystem drop-in",
5411
- "n0273": "dry-run: not. add --execute YSK_EXECUTE=1 firstreally ban",
5412
- "n0274": "dry-run: not. add --execute YSK_EXECUTE=1 firstreally unban",
6332
+ "n0271": "Dry-run: probe/plan only. Pass --execute with YSK_EXECUTE=1 to actually provision.",
6333
+ "n0272": "Dry-run: wrote the managed file (dataDir). Pass --execute with YSK_EXECUTE=1 as root to install the system drop-in.",
6334
+ "n0273": "Dry-run: not banned. Pass --execute with YSK_EXECUTE=1 to actually ban.",
6335
+ "n0274": "Dry-run: not unbanned. Pass --execute with YSK_EXECUTE=1 to actually unban.",
5413
6336
  "n0275": "dryRun=true — change API",
5414
6337
  "n0276": "dryRun: not write",
5415
6338
  "n0277": "dump Wrote dataDir, not transfer",
@@ -5519,7 +6442,7 @@
5519
6442
  "n0381": "post-transfer reapply",
5520
6443
  "n0382": "post-transfer restore",
5521
6444
  "n0383": "postconf not message_rate_limit (complete applied)",
5522
- "n0384": "postgres-replica Supports postgres",
6445
+ "n0384": "kind postgres-replica needs --engine postgres",
5523
6446
  "n0385": "postgres_databases name",
5524
6447
  "n0386": "postqueue unavailable or mailNot installed",
5525
6448
  "n0387": "Install nginx on the host, or use panel software / runtime install",
@@ -5688,7 +6611,7 @@
5688
6611
  "n0550": "128M, 256M, 512M, -1 ()",
5689
6612
  "n0551": "e.g. 512MiB; leave empty to unset",
5690
6613
  "n0552": "900 1 300 10; disable",
5691
- "n0553": ": --member 10.0.0.3=replica:fleet:SESSION_UUID",
6614
+ "n0553": "Paste a session UUID from /agents on the cluster form, or CLI --member 10.0.0.3=replica:fleet:SESSION_UUID",
5692
6615
  "n0554": "= ASN (system), not",
5693
6616
  "n0555": "22/80/443; can offnot port",
5694
6617
  "n0556": "kept: 10",
@@ -5758,7 +6681,7 @@
5758
6681
  "n0620": "startprocessnot process",
5759
6682
  "n0621": "OPcache",
5760
6683
  "n0622": "SSL",
5761
- "n0623": "",
6684
+ "n0623": "Active",
5762
6685
  "n0624": "file",
5763
6686
  "n0625": "file",
5764
6687
  "n0626": "node wsrep, HA ≥2 node",
@@ -5785,7 +6708,7 @@
5785
6708
  "n0647": "intern (MB)",
5786
6709
  "n0648": "password",
5787
6710
  "n0649": "Error, please apply",
5788
- "n0650": "Security → My security enable 2FA; policy may set requireAdminTotp",
6711
+ "n0650": "Enable admin 2FA under Security → My security, then add a backup admin on Users.",
5789
6712
  "n0651": "and path",
5790
6713
  "n0652": "install PAM",
5791
6714
  "n0653": "install vsftpd",
@@ -5974,7 +6897,7 @@
5974
6897
  "n0836": "certificateplease Failed",
5975
6898
  "n0837": "≥ file",
5976
6899
  "n0838": "settingskeptbackup",
5977
- "n0839": "Successthis target can BatchMode, ",
6900
+ "n0839": "Success means this target accepts BatchMode SSH (non-interactive). It is not a grant of global access.",
5978
6901
  "n0840": "or 32767",
5979
6902
  "n0841": "softwareInstalled",
5980
6903
  "n0842": "permission/",
@@ -6134,7 +7057,7 @@
6134
7057
  "n0996": "local nginx -t OK ( managed conf, ≠ edge applied)",
6135
7058
  "n0997": "local wsrep can, size not node",
6136
7059
  "n0998": "local ysk.json cannotread / fingerprint",
6137
- "n0999": "local OK; complete healthy peer probe (not )",
7060
+ "n0999": "Local node is OK; a complete healthy status needs a peer probe (not done).",
6138
7061
  "n1000": "local nginx — conf Wrote, not reload",
6139
7062
  "n1001": "localAvailable NM connection; willSuccess. can \"\" or NetworkManager.",
6140
7063
  "n1002": "localAvailable ps — cannot ()",
@@ -6260,7 +7183,7 @@
6260
7183
  "n1120": "domain — map for (systemapplywill postmap )",
6261
7184
  "n1121": "IP",
6262
7185
  "n1122": "Available auto-ban enrich",
6263
- "n1123": "cannot ban to system: YSK_EXECUTE; to panel ban",
7186
+ "n1123": "Cannot ban on the host: YSK_EXECUTE is off. The panel list was not changed.",
6264
7187
  "n1124": "cannot dump Redis: redis-cli",
6265
7188
  "n1125": "cannot dump: serverHost execute is not enabled",
6266
7189
  "n1126": "cannot fan-out: Host execute is not enabled",
@@ -6310,7 +7233,7 @@
6310
7233
  "n1170": "cannot from npm or GitHub version (not )",
6311
7234
  "n1171": "cannotprobe systemctl",
6312
7235
  "n1172": "cannot DNS cluster: Host execute is not enabled",
6313
- "n1173": "cannot: Host execute is not enabled (backupSuccess)",
7236
+ "n1173": "Host execute is off. Live SFTP/S3/local probe needs YSK_EXECUTE=1.",
6314
7237
  "n1174": "cannot metrics",
6315
7238
  "n1175": "cannot: serverHost execute is not enabled",
6316
7239
  "n1176": "cannot ACME: Host execute is not enabled",
@@ -6730,7 +7653,7 @@
6730
7653
  "n1590": "",
6731
7654
  "n1591": "Not root — useradd / systemd / nginx system paths are restricted",
6732
7655
  "n1592": "not seccomp requires runAsUser",
6733
- "n1593": "panelplease /",
7656
+ "n1593": "Public requests / min",
6734
7657
  "n1594": "panelconnection; Available\"\" ( )",
6735
7658
  "n1595": "Panel is not running as root",
6736
7659
  "n1596": "Available apply:false",
@@ -6748,6 +7671,8 @@
6748
7671
  "n1608": "verifyinvalid",
6749
7672
  "n1609": "passed",
6750
7673
  "n1610": "Package index not refreshed (YSK_EXECUTE off) — showing apt list only; enable execute to run apt-get update",
7674
+ "n1611": "UFW is inactive: {{n}} permanent deny rule(s) are stored in user.rules but the kernel is not enforcing them.",
7675
+ "n1612": "UFW is inactive. A deny rule would be written to user.rules only — the kernel would not drop packets. Enable UFW first. Not enabling automatically.",
6751
7676
  "t0001": "listenPort invalid: {{v0}}",
6752
7677
  "t0002": "restoreversion {{v0}}",
6753
7678
  "t0003": "file (>{{v0}} bytes)",
@@ -7001,7 +7926,7 @@
7001
7926
  "t0251": "{{v0}} Install incomplete",
7002
7927
  "t0252": "{{v0}} servicestart",
7003
7928
  "t0253": "Start failed: {{v0}}",
7004
- "t0254": "Supports Node.js version {{v0}}; Availableversion: {{v1}}",
7929
+ "t0254": "Supports Node.js version {{v0}}; available versions: {{v1}}",
7005
7930
  "t0255": "Supports PHP version {{v0}}; Available: {{v1}}",
7006
7931
  "t0256": "Supports Python version {{v0}}; Available: {{v1}}",
7007
7932
  "t0257": "Supports Go version {{v0}}; Available: {{v1}}",
@@ -7078,7 +8003,7 @@
7078
8003
  "t0328": "projectdirectory: {{v0}}",
7079
8004
  "t0329": "tar failed: {{v0}}",
7080
8005
  "t0330": "Wrotebackup {{v0}}",
7081
- "t0331": "dry-run: file {{v0}}+ ( {{v1}})",
8006
+ "t0331": "Preview: {{v0}} files in the archive (showing {{v1}})",
7082
8007
  "t0332": "cannot: {{v0}}",
7083
8008
  "t0333": "restore (web) to {{v0}}",
7084
8009
  "t0334": "web restoreFailed: {{v0}}",
@@ -7123,20 +8048,20 @@
7123
8048
  "t0373": "Project \"{{v0}}\" isolation",
7124
8049
  "t0374": "to localpath {{v0}}",
7125
8050
  "t0375": "identity {{v0}}: {{v1}}",
7126
- "t0376": "scp (identity) to {{v0}}",
7127
- "t0377": "scp(identity) failed: {{v0}}",
7128
- "t0378": "scp to {{v0}}",
7129
- "t0379": "scp failed: {{v0}}",
7130
- "t0380": "scp to {{v0}}",
7131
- "t0381": "scp Failed: {{v0}} ( backup remote identityId)",
8051
+ "t0376": "sftp (identity) to {{v0}} ok",
8052
+ "t0377": "sftp (identity) failed: {{v0}}",
8053
+ "t0378": "sftp to {{v0}} ok",
8054
+ "t0379": "sftp failed: {{v0}}",
8055
+ "t0380": "sftp to {{v0}} ok",
8056
+ "t0381": "sftp failed: {{v0}} (set backup remote identityId)",
7132
8057
  "t0382": "S3 {{v0}}",
7133
8058
  "t0383": "S3 failed: {{v0}}",
7134
8059
  "t0384": ": {{v0}}/{{v1}} admin Enabled 2FA",
7135
- "t0385": "Policy not enforced: {{v0}}/{{v1}} admin(s) have 2FA enabled",
8060
+ "t0385": "Policy not enforced: {{v0}}/{{v1}} admin(s) have 2FA. If there is a single admin without 2FA, enable 2FA then add a backup admin.",
7136
8061
  "t0386": "{{v0}} PATH",
7137
8062
  "t0387": "{{v0}} not found",
7138
8063
  "t0388": "Install {{v0}} or add it to PATH",
7139
- "t0389": "Availableversion: {{v0}}",
8064
+ "t0389": "Available versions: {{v0}}",
7140
8065
  "t0390": "{{v0}}% ( {{v1}} MB)",
7141
8066
  "t0391": "{{v0}}% ({{v1}})",
7142
8067
  "t0392": "servicestart {{v0}}",
@@ -7379,15 +8304,15 @@
7379
8304
  "t0629": "project {{v0}} home: {{v1}}",
7380
8305
  "t0630": "project {{v0}} bind_ip={{v1}} — can ( IP )",
7381
8306
  "t0631": "project {{v0}} home not path: {{v1}}",
7382
- "t0632": "home (store ): {{v0}}",
8307
+ "t0632": "Orphan home on disk (no matching store project): {{v0}}",
7383
8308
  "t0633": "Maildir: {{v0}}",
7384
8309
  "t0634": "{{v0}} — cannot to target",
7385
8310
  "t0635": "cannotprobe {{v0}}",
7386
8311
  "t0636": "{{v0}} · {{v1}}",
7387
8312
  "t0637": "project {{v0}} · {{v1}} · DB {{v2}} · Redis {{v3}}",
7388
- "t0638": "installsoftware {{v0}} · homes {{v1}}",
8313
+ "t0638": "Install software {{v0}} · homes {{v1}}",
7389
8314
  "t0639": "cutover host {{v0}}",
7390
- "t0640": "Warning {{v0}} (please )",
8315
+ "t0640": "{{v0}} warning(s) — review before cutover.",
7391
8316
  "t0641": "key {{v0}}",
7392
8317
  "t0642": "cannotkey: {{v0}}",
7393
8318
  "t0643": "targetnot write authorized_keys: {{v0}}",
@@ -7451,7 +8376,7 @@
7451
8376
  "t0701": "CDN {{v0}}",
7452
8377
  "t0702": "origin shield Node does not exist: {{v0}}",
7453
8378
  "t0703": "edges: {{v0}}",
7454
- "t0704": "origin URL (): {{v0}}",
8379
+ "t0704": "Origin URL (from project bind): {{v0}}",
7455
8380
  "t0705": "update CDN {{v0}}",
7456
8381
  "t0706": "create CDN {{v0}}",
7457
8382
  "t0707": "origin shield: edge shield {{v0}} → {{v1}}",
@@ -7547,7 +8472,14 @@
7547
8472
  "t0797": "timezone failed: {{v0}}",
7548
8473
  "tScoreFrom": "score={{score}} from={{from}}",
7549
8474
  "appliedTag": " (applied)",
7550
- "writtenTag": " (written only)"
8475
+ "writtenTag": " (written only)",
8476
+ "selfDestMissing": "Cannot find the running install directory (systemd ExecStart or cli.js)",
8477
+ "selfDestUnwritable": "Cannot write to the running install directory {{v0}}",
8478
+ "selfApplied": "Applied {{v0}} onto {{v1}}",
8479
+ "selfVerifyFail": "Version file after overlay does not contain {{v0}}",
8480
+ "selfDownloadFail": "Cannot download or unpack official package {{v0}}: {{v1}}",
8481
+ "selfOverlayFail": "Could not overlay the official package onto the running install: {{v0}}",
8482
+ "selfUpgradeHint": "Panel apply failed. As root run: curl -fsSL https://raw.githubusercontent.com/yanshekki/ysk-server/main/install.sh | bash -s -- --upgrade"
7551
8483
  },
7552
8484
  "tpl": {
7553
8485
  "deleted": "Deleted {{name}}",
@@ -7610,7 +8542,7 @@
7610
8542
  "noParen": "(none)",
7611
8543
  "keepOldDb": "(kept old DB)",
7612
8544
  "ufwNotDetected": "UFW not detected on this host",
7613
- "fail2banStartHint": "Start it on the Fail2ban page",
8545
+ "fail2banStartHint": "Start it on the fail2ban page",
7614
8546
  "hasExecuteNotRoot": "EXECUTE is on but process is not root",
7615
8547
  "notRootTarget": "Not root (target useradd/apt will be blocked)",
7616
8548
  "reapplyDone": "reapply key steps completed",
@@ -7739,6 +8671,8 @@
7739
8671
  "openvpnComing": "OpenVPN full path is staged for the next release.",
7740
8672
  "outlineComing": "Outline / Shadowsocks is staged for a later release.",
7741
8673
  "needExecuteServer": "VPN server setup requires root and YSK_EXECUTE=1.",
8674
+ "serverStopped": "{{engine}} server stopped.",
8675
+ "serverStopFailed": "Could not stop {{engine}} server: {{detail}}",
7742
8676
  "needExecuteClient": "VPN client connect requires root and YSK_EXECUTE=1.",
7743
8677
  "keygenFailed": "WireGuard key generation failed (is wg installed?).",
7744
8678
  "serverKeysCreated": "WireGuard server keys created.",
@@ -7748,6 +8682,7 @@
7748
8682
  "peerCreated": "Client «{{name}}» created.",
7749
8683
  "peerNotFound": "Client not found.",
7750
8684
  "peerRemoved": "Client removed.",
8685
+ "peersSynced": "Peer list reloaded on the running WireGuard interface.",
7751
8686
  "setEndpointHint": "Set public endpoint (host:port) so mobile clients can reach this server.",
7752
8687
  "invalidConf": "Conf must include [Interface] and PrivateKey.",
7753
8688
  "clientImported": "Profile «{{name}}» imported.",
@@ -7816,10 +8751,12 @@
7816
8751
  "userdelBlocked": "Cannot remove Linux user {{user}} without root + YSK_EXECUTE",
7817
8752
  "userAlreadyGone": "Linux user {{user}} already absent",
7818
8753
  "userdelFailed": "userdel failed for {{user}}: {{detail}}",
8754
+ "userdelLeftover": "Panel account removed, but Linux user {{user}} is still on the host. Remove it from Users or the host.",
7819
8755
  "userDeleted": "Removed Linux user {{user}}",
7820
8756
  "passwordTooShort": "VNC password must be at least 6 characters",
7821
8757
  "passwordWrittenOnly": "Password marked in control plane only (need root + YSK_EXECUTE for vncpasswd)",
7822
8758
  "passwordFailed": "Failed to write VNC password: {{detail}}",
8759
+ "passwordNeedTiger": "vncpasswd not found. Install TigerVNC (tigervnc-standalone-server) before setting a password.",
7823
8760
  "passwordSet": "VNC password set for {{user}}",
7824
8761
  "passwordUpdated": "Password updated for {{name}}",
7825
8762
  "passwordMetaOnly": "Password stored as meta only until system apply",
@@ -7829,6 +8766,7 @@
7829
8766
  "xstartupWritten": "Wrote {{path}}",
7830
8767
  "sessionStartBlocked": "Cannot start VNC session without root + YSK_EXECUTE",
7831
8768
  "sessionStartFailed": "Failed to start display :{{display}}: {{detail}}",
8769
+ "sessionStartHostname": "Failed to start display :{{display}}: this host cannot resolve its own hostname. Add the hostname to /etc/hosts (or fix DNS) then start the session again.",
7832
8770
  "sessionStarted": "Started VNC for {{user}} on :{{display}} (port {{port}})",
7833
8771
  "sessionStartUnverified": "Start command returned OK but RFB port not yet listening",
7834
8772
  "sessionAlreadyRunning": "VNC already running for {{user}} on :{{display}} (port {{port}})",
@@ -7871,7 +8809,9 @@
7871
8809
  "clientDeleted": "Client profile deleted",
7872
8810
  "sessionStartCwd": "VNC start failed: working directory not accessible to the session user (display :{{display}}). Fixed by starting from HOME.",
7873
8811
  "desktopRestarted": "Desktop profile applied and session restarted ({{desktop}}). Reconnect VNC/noVNC.",
7874
- "desktopNeedsStart": "Desktop profile {{desktop}} written to xstartup. Start the session to apply."
8812
+ "desktopNeedsStart": "Desktop profile {{desktop}} written to xstartup. Start the session to apply.",
8813
+ "linuxUserRolledBack": "Removed leftover Linux user {{user}} after VNC password failed.",
8814
+ "linuxUserOrphan": "Could not remove leftover Linux user {{user}} after VNC password failed."
7875
8815
  },
7876
8816
  "apache": {
7877
8817
  "needServerName": "Server name required",
@@ -7921,7 +8861,64 @@
7921
8861
  "startedDetached": "BT tracker detached worker started (pid {{pid}}, port {{port}})",
7922
8862
  "runningDetached": "Tracker running as detached worker (pid {{pid}})",
7923
8863
  "jobQueued": "BT torrent creation queued (large share)",
7924
- "jobRunning": "BT torrent creation running"
8864
+ "jobRunning": "BT torrent creation running",
8865
+ "libraryAdded": "Added {{name}} to the WebTorrent library",
8866
+ "libraryInspectFailed": "Could not read that .torrent or magnet",
8867
+ "libraryDup": "That torrent is already in the library",
8868
+ "libraryDestBad": "Save folder is not a valid Files path",
8869
+ "libraryTorrentTooBig": ".torrent file is larger than 8 MiB",
8870
+ "libraryNotFound": "Library item not found",
8871
+ "libraryPaused": "Paused",
8872
+ "libraryResumed": "Resumed",
8873
+ "libraryRemoved": "Removed from library",
8874
+ "libraryFilesRemoved": "Deleted downloaded files",
8875
+ "libraryRestoreDone": "Library restore: started {{started}}/{{attempted}} (failed {{failed}})",
8876
+ "applyTrackersDone": "Applied extra trackers to {{n}} live announce slots",
8877
+ "libraryNeedServe": "Saved. Open the panel (ysk-server serve) so WebTorrent can download or seed.",
8878
+ "libraryDestIsFile": "Cannot create a folder named {{name}} — a file with that name already exists.",
8879
+ "librarySeedMissing": "No matching files in that folder to seed.",
8880
+ "libraryWaitingPeers": "Waiting for peers. If the files are already on this host, add again and choose seed-existing."
8881
+ },
8882
+ "migrate": {
8883
+ "orphanConfirm": "Type the exact leftover home path to confirm delete.",
8884
+ "orphanStillInStore": "That home still belongs to a project in the store.",
8885
+ "orphanMissing": "Path not on disk: {{path}}",
8886
+ "orphanNeedExecute": "Would remove leftover {{path}}. Needs YSK_EXECUTE=1.",
8887
+ "orphanRmFailed": "Could not remove leftover home: {{detail}}",
8888
+ "orphanRemoved": "Removed leftover project home {{path}}."
8889
+ },
8890
+ "publicFiles": {
8891
+ "liveConf": "Live Nginx conf: {{path}}",
8892
+ "publicRoot": "Public root: {{path}}",
8893
+ "confNameStale": "Conf file {{file}} does not match current server_name {{serverName}}. Re-apply public files to rewrite the name."
8894
+ },
8895
+ "leftover": {
8896
+ "staleCliTitle": "Stale leftover CLI",
8897
+ "staleCli": "Leftover CLI still present: {{path}} (running product {{version}}). PATH may prefer it. Remove with: rm -f {{path}}",
8898
+ "apacheDefaultTitle": "Apache leftover default site",
8899
+ "apacheDefault": "Apache 000-default is still enabled. That is the stock site file — it does not mean Apache is listening on public :80 (YSK Apache is expected on 127.0.0.1:8080). Overlay does not disable it. Apply Apache from the panel or hosting apache apply --execute.",
8900
+ "nginxCatchAllTitle": "Nginx catch-all missing",
8901
+ "nginxCatchAll": "ysk-000-default.conf is not in /etc/nginx/conf.d. Unknown SNI can fall through. Run projects nginx-sync --execute.",
8902
+ "vsftpdTitle": "vsftpd unit failed",
8903
+ "vsftpd": "vsftpd is failed. Overlay does not rewrite listen/listen_ipv6. Apply FTP from the panel.",
8904
+ "dovecotTitle": "Dovecot TLS points at missing cert",
8905
+ "dovecot": "Dovecot ssl_cert points at missing {{path}}. Overlay does not rewrite ssl=no. Apply mail TLS after issuing the cert, or apply email stack.",
8906
+ "overlayDoesNotHeal": "Product overlay does not rewrite nginx, Apache, vsftpd, or Dovecot. Use the listed apply commands (root + YSK_EXECUTE=1).",
8907
+ "staleCliRemoved": "Removed leftover CLI {{path}}.",
8908
+ "staleCliRemoveFailed": "Could not remove leftover CLI {{path}}: {{detail}}",
8909
+ "vsftpdSslOff": "Set vsftpd ssl_enable=NO because the FTPS certificate file is missing, then restarted vsftpd.",
8910
+ "dovecotSslOff": "Set Dovecot ssl=no because {{path}} is missing, then restarted Dovecot.",
8911
+ "readinessTitle": "Host leftovers after overlay",
8912
+ "readinessClean": "No leftover Apache default, missing nginx catch-all, failed vsftpd, or stale CLI detected."
8913
+ },
8914
+ "defense": {
8915
+ "panelReqLabel": "Panel requests / min",
8916
+ "panelReqExcluded": "Authenticated panel traffic — shown here, not counted in threat score",
8917
+ "tcpOk": "TCP {{target}} reachable",
8918
+ "tcpFail": "TCP {{target}} failed",
8919
+ "dnsDegraded": "DNS path degraded",
8920
+ "reqRateHigh": "Public request rate {{reqs}}/min ≥ {{threshold}}",
8921
+ "ddosHeuristic": "High public request rate plus edge probe failure"
7925
8922
  }
7926
8923
  },
7927
8924
  "ops": {
@@ -8072,13 +9069,16 @@
8072
9069
  "template": "Template (optional)",
8073
9070
  "templateNone": "— none —",
8074
9071
  "searchPlaceholder": "Search name, domain, or ID…",
9072
+ "listDesc": "Manage sites on this host.",
8075
9073
  "filterAll": "All runtimes",
8076
9074
  "statTotal": "Total",
8077
9075
  "statRunning": "Running",
8078
9076
  "statDegraded": "Degraded",
8079
9077
  "statUnhealthy": "Unhealthy",
8080
9078
  "statStopped": "Stopped / ready",
8081
- "statPendingOs": "Pending OS",
9079
+ "statStoppedOnly": "Stopped",
9080
+ "statReadyOnly": "Ready",
9081
+ "statPendingOs": "OS user pending",
8082
9082
  "status": {
8083
9083
  "failed": "Failed",
8084
9084
  "failedHint": "Deploy or health check failed — check logs",
@@ -8123,7 +9123,12 @@
8123
9123
  "httpStatus": "HTTP",
8124
9124
  "latency": "Latency",
8125
9125
  "error": "Error",
8126
- "at": "Checked at"
9126
+ "at": "Checked at",
9127
+ "deployMode": "Deploy mode",
9128
+ "edgeKind": "Edge",
9129
+ "goLiveOk": "Go-live",
9130
+ "goLiveAt": "Go-live at",
9131
+ "degraded": "Degraded"
8127
9132
  },
8128
9133
  "railPhp": "PHP / site",
8129
9134
  "railStatic": "Static site",
@@ -8137,7 +9142,16 @@
8137
9142
  "neverDeployed": "Never deployed",
8138
9143
  "created": "Created {{name}}",
8139
9144
  "backToList": "Back to projects",
8140
- "openUrl": "Open URL",
9145
+ "openUrl": "Open site",
9146
+ "openUrlNeedDomain": "Set a domain first — do not open 127.0.0.1 in your browser",
9147
+ "needOsUser": "Create the system user on the Isolation tab first",
9148
+ "goIsolation": "Open Isolation tab",
9149
+ "homeMissing": "Home directory does not exist",
9150
+ "homeMissingHint": "Same live probe as migrate inventory — create the system user on Isolation",
9151
+ "stopTitle": "Stop this project (systemd unit and public site)",
9152
+ "deployTitle": "Deploy this project",
9153
+ "httpStatsHint": "From this project’s access log (last sample)",
9154
+ "httpStatsNone": "No project access log yet",
8141
9155
  "notFound": "Project not found",
8142
9156
  "home": "Home directory",
8143
9157
  "env": "Environment",
@@ -8187,8 +9201,8 @@
8187
9201
  "healthUnknown": "Not checked",
8188
9202
  "sectionRuntimeDeploy": "Runtime deploy",
8189
9203
  "sectionRuntimeDeployDesc": "Start the process for this project runtime (Node / PHP)",
8190
- "sectionGit": "Git deploy",
8191
- "sectionGitDesc": "Pull from Git and redeploy",
9204
+ "sectionGit": "Git",
9205
+ "sectionGitDesc": "Clone, sync, and inbound push",
8192
9206
  "sectionEnv": "Environment variables",
8193
9207
  "sectionEnvDesc": "Write KEY=value lines to the project .env",
8194
9208
  "gitUrl": "Git URL",
@@ -8234,7 +9248,7 @@
8234
9248
  "nginxValuePublished": "Published",
8235
9249
  "nginxValueNone": "Not published",
8236
9250
  "osValueReady": "Ready",
8237
- "osValuePending": "Pending",
9251
+ "osValuePending": "OS user pending",
8238
9252
  "openFiles": "Files",
8239
9253
  "enableCdn": "Enable CDN",
8240
9254
  "openLogs": "Logs",
@@ -8243,10 +9257,11 @@
8243
9257
  "osUserIncomplete": "System user provisioning incomplete",
8244
9258
  "saveLogDirsFailed": "Failed to save log directories",
8245
9259
  "createName": "Project name",
9260
+ "noPathSepHint": "The name cannot contain / or \\.",
8246
9261
  "createRuntime": "Runtime",
8247
9262
  "createRuntimeHint": "You can change deploy options later in detail",
8248
9263
  "createVersion": "Version",
8249
- "createVersionHint": "Stored as runtime_version; used by deploy / FPM",
9264
+ "createVersionHint": "Writes the project runtime version setting; deploy / FPM uses it",
8250
9265
  "createVersionAria": "Runtime version",
8251
9266
  "createPrimaryDomain": "Primary domain",
8252
9267
  "createPrimaryDomainHint": "Optional for now",
@@ -8390,8 +9405,16 @@
8390
9405
  "netHttpsDesc": "Publish Nginx after save. Full-site 301 overrides proxy/PHP/static content",
8391
9406
  "netForceHttps": "Force HTTPS",
8392
9407
  "netForceHttpsDesc": "HTTP → HTTPS (301); needs SSL cert and SSL publish",
9408
+ "netForceHttpsOn": "HTTP will redirect to HTTPS after you publish the edge.",
9409
+ "netForceHttpsOff": "No forced redirect is stored.",
9410
+ "netBoundCert": "Bound certificate",
9411
+ "netBoundCertExpiry": "expires {{at}}",
9412
+ "netNoBoundCert": "No certificate on disk for this hostname",
9413
+ "netForceHttpsNeedCert": "Issue a certificate on /ssl for this domain before forcing HTTPS.",
9414
+ "netHttpsLiveNotForced": "An edge file exists; HTTPS may already work. This box only forces HTTP→HTTPS.",
8393
9415
  "netHsts": "Enable HSTS",
8394
9416
  "netHstsDesc": "Browsers stick to HTTPS (recommended after force HTTPS)",
9417
+ "netHstsNeedHttps": "Turn on force HTTPS first",
8395
9418
  "netRedirectUrl": "Full-site redirect URL",
8396
9419
  "netRedirectHint": "Optional. Full-site 301 to this URL (move / apex→www)",
8397
9420
  "netBasicAuthTitle": "HTTP basic auth (browser login)",
@@ -8512,7 +9535,7 @@
8512
9535
  "deployPhpIniSaved": "Project php.ini overrides saved; deploy or apply FPM again",
8513
9536
  "deployHistory": "Deploy history ({{count}})",
8514
9537
  "deployHistoryDesc": "From audit; newest first",
8515
- "deployGitUrlHint": "HTTPS or SSH repo URL; sync then redeploy by runtime",
9538
+ "deployGitUrlHint": "HTTPS or git@host:org/repo.git",
8516
9539
  "deployEnvHint": "One KEY=value per line; # comments",
8517
9540
  "resume": "Resume project",
8518
9541
  "suspend": "Suspend project",
@@ -8598,16 +9621,111 @@
8598
9621
  "netPublishMaint": "Maintenance",
8599
9622
  "sslNeedDomain": "Set a domain before publishing Nginx / SSL.",
8600
9623
  "createTemplateMissing": "{{v0}} ;「— —」。",
8601
- "deleteDialogDesc": "{{v0}}」。。",
9624
+ "deleteDialogDesc": "This permanently deletes “{{name}}”. It cannot be undone.",
8602
9625
  "deleteWillStop": "systemd / PM2 /",
8603
9626
  "deleteWillWeb": "Nginx conf、PHP-FPM pool、Apache vhost()",
8604
9627
  "deleteWillOs": "Linux home ()",
8605
9628
  "deleteKeepOs": "home Linux ()",
8606
9629
  "deleteWillDb": "…",
8607
9630
  "deleteRemoveFilesDesc": "Cancel,",
8608
- "deleteTypeNameHint": "「{{v0}}」",
9631
+ "deleteTypeNameHint": "「{{name}}」",
8609
9632
  "deleteDnsWarn": "DNS zone / domain 。",
8610
- "manageInNginx": "Manage in Nginx"
9633
+ "manageInNginx": "Manage in Nginx",
9634
+ "advFtpHomeApp": "Site app directory",
9635
+ "advFtpHomeRoot": "Project home (full)",
9636
+ "advFtpManage": "Open FTP page",
9637
+ "resShell": "Login shell",
9638
+ "resSaveHint": "Save and apply changes the live OS. Control-plane only stores the form. Re-apply uses the last saved values.",
9639
+ "resBashConfirmTitle": "Allow interactive bash?",
9640
+ "resBashConfirmDesc": "This grants an interactive login shell to the project user. Confirm only if you need SSH or PTY as that user.",
9641
+ "createGitHint": "Optional. Stored on the project; clone from the Deploy tab (does not clone on create).",
9642
+ "gitTokenLaterHint": "HTTPS token and clone depth are set on the project Deploy tab after create.",
9643
+ "gitBranch": "Branch",
9644
+ "gitBranchHint": "Pick a remote branch or tag.",
9645
+ "gitBranchAfterUrl": "Enter a Git URL first. Empty uses the remote default branch.",
9646
+ "gitLastRef": "Last sync: {{branch}} @ {{commit}}",
9647
+ "gitConfirmTitle": "Clone into this project?",
9648
+ "gitConfirmBody": "If app/ is still the Hello World placeholder it will be cleared, then cloned. Custom files that are not a YSK scaffold are refused.",
9649
+ "gitConfirmRemoteBody": "This points origin at the new URL and pulls. Unrelated histories fail; custom files are not wiped.",
9650
+ "runtimeActual": "Actual binary {{path}}",
9651
+ "runtimeFallback": "Chosen {{version}} is not on this host. Process uses {{path}}.",
9652
+ "gitSync": "Sync",
9653
+ "gitFetch": "Fetch",
9654
+ "gitCheckout": "Checkout",
9655
+ "gitReset": "Reset to remote",
9656
+ "gitResetNeedConfirm": "Needs confirmation — discards local commits",
9657
+ "gitDeepen": "Fetch full history",
9658
+ "gitLogTitle": "Recent commits",
9659
+ "gitDirtyTitle": "Local changes block pull",
9660
+ "gitDirtyBody": "{{count}} file(s) differ from Git (Files edits or the app). Discard them or abort.",
9661
+ "gitSyncBlockedDirty": "Sync is disabled until local changes are discarded (Reset) or the files match Git.",
9662
+ "gitViewDiff": "View diff",
9663
+ "gitDiscard": "Discard local files",
9664
+ "gitOpenFiles": "Open in Files",
9665
+ "gitNotCloned": "Not cloned",
9666
+ "gitClean": "Clean",
9667
+ "gitDirty": "Dirty",
9668
+ "gitBehind": "Behind {{count}}",
9669
+ "gitAhead": "Ahead {{count}}",
9670
+ "gitDetached": "Pinned",
9671
+ "gitShallow": "Shallow",
9672
+ "gitMissing": "git missing",
9673
+ "gitResetConfirmTitle": "Reset hard to remote?",
9674
+ "gitResetConfirmBody": "This discards local Git history and untracked files except .env, then restores .env from the control plane.",
9675
+ "gitHeads": "Remote branches",
9676
+ "gitToken": "HTTPS token",
9677
+ "gitTokenHint": "Encrypted at rest. Never stored in the remote URL.",
9678
+ "gitTokenPlaceholder": "ghp_… or glpat-…",
9679
+ "gitTokenSet": "Token set",
9680
+ "gitSaveToken": "Save token",
9681
+ "gitClearToken": "Clear token",
9682
+ "gitDeployKey": "Deploy public key",
9683
+ "gitDeployKeyHint": "Add this as a read-only deploy key on the Git host.",
9684
+ "gitDeployKeyOn": "Deploy key",
9685
+ "gitMakeKey": "Create deploy key",
9686
+ "gitCopyPub": "Copy public key",
9687
+ "gitClearKey": "Clear deploy key",
9688
+ "gitKeyCopied": "Public key copied",
9689
+ "gitPinHost": "Pin host key",
9690
+ "gitPinHostBody": "{{host}} is not pinned. Confirm the fingerprints, then pin before SSH clone.",
9691
+ "gitHostUnpinned": "Host key not pinned",
9692
+ "gitHookTitle": "Push hook",
9693
+ "gitHookHint": "Paste the URL into GitHub / Gitea / GitLab (push only). Not Slack.",
9694
+ "gitHookOn": "On",
9695
+ "gitHookOff": "Off",
9696
+ "gitHookEnable": "Enable",
9697
+ "gitHookRotate": "Rotate secret",
9698
+ "gitHookDisable": "Disable",
9699
+ "gitHookSecretOnce": "Copy this secret now — it will not be shown again.",
9700
+ "gitHookCopyUrl": "Copy",
9701
+ "gitHookCopySecret": "Copy secret",
9702
+ "gitHookCopied": "Copied",
9703
+ "gitHookSetup": "Payload URL = the URL above. Content type application/json. Events: push only. Secret = the one-time value.",
9704
+ "gitHookGithub": "Settings → Webhooks → Add webhook. Content type application/json. Events: Just the push event. GitHub.com needs HTTPS.",
9705
+ "gitHookGitea": "Settings → Webhooks → Add Webhook → Gitea. Method POST. Event: Push.",
9706
+ "gitHookGitlab": "Settings → Webhooks. Trigger: Push events. Secret token = hook secret (X-Gitlab-Token).",
9707
+ "gitHookHonesty": "Host unit needs YSK_EXECUTE=1 or the hook only returns a plan.",
9708
+ "gitHookSkipOther": "Other branches are ignored.",
9709
+ "gitAuthHttps": "HTTPS token",
9710
+ "gitAuthSsh": "SSH deploy key",
9711
+ "gitLoadRefs": "Load branches",
9712
+ "gitRefDefault": "Remote default",
9713
+ "gitRefBranches": "Branches",
9714
+ "gitRefTags": "Tags",
9715
+ "gitRefOther": "Other ref…",
9716
+ "gitRefCustom": "Commit or ref",
9717
+ "gitRefsNeedUrl": "Enter a URL first.",
9718
+ "gitRefsNeedAuth": "Save a token or deploy key, then load branches.",
9719
+ "gitRefsHint": "Loaded from the remote. Choose one — do not type.",
9720
+ "gitHookSetupToggle": "How to paste this",
9721
+ "gitHookOneLiner": "HMAC or X-YSK-Git-Hook. Only this project’s ref.",
9722
+ "gitHookExecuteHint": "Needs YSK_EXECUTE=1 to clone or deploy.",
9723
+ "gitShowKey": "Show key",
9724
+ "gitHideKey": "Hide",
9725
+ "gitBehindShort": "↓{{count}}",
9726
+ "gitAheadShort": "↑{{count}}",
9727
+ "gitDirtyShort": "Dirty · {{count}}",
9728
+ "gitFilesLink": "Files"
8611
9729
  },
8612
9730
  "protection": {
8613
9731
  "levels": {
@@ -8641,7 +9759,9 @@
8641
9759
  "note": {
8642
9760
  "notApplied": "Not applied on host (needs root + YSK_EXECUTE=1) — saved to panel settings",
8643
9761
  "nginxWritten": "Wrote Nginx rate-limit panel file",
8644
- "f2bWritten": "Wrote fail2ban panel settings"
9762
+ "f2bWritten": "Wrote fail2ban panel settings",
9763
+ "hintDropped": "Internal protection hint omitted",
9764
+ "nginxLimits": "Will write Nginx rate-limit snippet"
8645
9765
  },
8646
9766
  "rel": {
8647
9767
  "justNow": "Just now",
@@ -8664,6 +9784,10 @@
8664
9784
  "autoBanAutomation": "Auto-ban: {{onOff}} ({{mode}})",
8665
9785
  "automationSaved": "Automation settings saved",
8666
9786
  "statFirewall": "Firewall",
9787
+ "statSuspects": "Suspect IPs",
9788
+ "statSuspectsSplit": "{{actionable}} actionable / {{total}} listed",
9789
+ "suspectActionableCount": "Actionable IPs {{count}}",
9790
+ "scoreBasisHint": "Listed suspects vs IPs you can still ban (excludes already banned / whitelist).",
8667
9791
  "statAutoBan": "Auto-ban",
8668
9792
  "statApply": "System apply",
8669
9793
  "statActiveBans": "Active bans",
@@ -8683,6 +9807,12 @@
8683
9807
  "reapply": "Re-apply",
8684
9808
  "nginxLimits": "Nginx rate limits",
8685
9809
  "notWritten": "Not written",
9810
+ "modeValue": {
9811
+ "normal": "Normal",
9812
+ "degraded": "Degraded",
9813
+ "ddos-protection": "DDoS protection",
9814
+ "offline": "Offline"
9815
+ },
8686
9816
  "mode": "Mode",
8687
9817
  "controlPlane": "Control plane",
8688
9818
  "canApply": "Can apply",
@@ -8790,6 +9920,10 @@
8790
9920
  "dbReady": "DB ready",
8791
9921
  "stale": "Stale",
8792
9922
  "older7d": ">7 days",
9923
+ "freshnessNa": "n/a",
9924
+ "freshnessMissing": "No database",
9925
+ "freshnessStale": "Stale",
9926
+ "freshnessFresh": "Current",
8793
9927
  "lastSuccess": "Last success",
8794
9928
  "downloaded": "Downloaded",
8795
9929
  "missing": "Missing",
@@ -8844,10 +9978,19 @@
8844
9978
  "sectionAutoBan": "② Auto-ban",
8845
9979
  "unban": "Unban",
8846
9980
  "ban": "Ban",
9981
+ "banConfirmTitle": "Ban {{ip}}?",
9982
+ "banConfirmDesc": "This IP will be blocked on the host. Confirm it is not a current panel or session address.",
9983
+ "wlRemovedUndo": "Removed {{ip}} from the allow list. Undo within 5 seconds.",
9984
+ "undo": "Undo",
9985
+ "banSelectedConfirmTitle": "Ban {{count}} selected IPs?",
9986
+ "banSelectedConfirmDesc": "These addresses will be blocked on the host: {{ips}}",
8847
9987
  "save": "Save",
8848
9988
  "yes": "Yes",
8849
9989
  "no": "No",
8850
9990
  "oneClickSuggested": "Apply suggested preset",
9991
+ "stackApply": "Apply protection stack (UFW, fail2ban, preset)",
9992
+ "stackApplyDone": "Protection stack apply requested",
9993
+ "stackApplyHint": "This enables UFW and applies fail2ban plus the suggested preset. Confirm you will not lock yourself out of a remote panel.",
8851
9994
  "viewPresets": "View presets",
8852
9995
  "suspectIpsCount": "Suspect IPs {{count}}",
8853
9996
  "goBans": "Go to bans",
@@ -8903,7 +10046,12 @@
8903
10046
  "f2bTool": "fail2ban tool",
8904
10047
  "noSecondJail": "(no second jail editor here).",
8905
10048
  "autoBanWhitelistTitle": "Auto-ban whitelist",
8906
- "autoBanWhitelistDesc": "Protection auto-ban exemptions (syncs fail2ban ignoreip",
10049
+ "autoBanWhitelistDesc": "Protection auto-ban exemptions (syncs fail2ban ignoreip).",
10050
+ "ufwOff": "UFW (off)",
10051
+ "ufwOffHint": "UFW is not active — fail2ban is the usable target.",
10052
+ "whitelistSyncHint": "{{n}} panel entries · fail2ban ignoreip sync: {{sync}}",
10053
+ "whitelistSyncOn": "on",
10054
+ "whitelistSyncOff": "off (lists may differ)",
8907
10055
  "ignoreipWhitelist": "ignoreip whitelist",
8908
10056
  "notSetSuggestAdmin": "Not set (add your admin IP)",
8909
10057
  "moreItems": "… {{n}} more · see fail2ban whitelist",
@@ -8917,6 +10065,11 @@
8917
10065
  "fullLogsAt": "Full nginx/auth logs:",
8918
10066
  "logCenter": "Log center",
8919
10067
  "colScore": "Score",
10068
+ "colHits": "Hits",
10069
+ "col429": "429",
10070
+ "topIpsTitle": "Top IPs",
10071
+ "hitsCount": "{{n}} hits",
10072
+ "sampleWindowHint": "Counts are from the current access + auth sample window, not the full log file.",
8920
10073
  "banShort": "Ban",
8921
10074
  "vhostLimits": "Vhost rate limits",
8922
10075
  "eventStream": "Event stream",
@@ -8955,7 +10108,34 @@
8955
10108
  "plusRegion": "+ region {{v}}",
8956
10109
  "plusCity": "+ city {{v}}",
8957
10110
  "lastTickPrefix": "· last {{t}}",
8958
- "nextTickPrefix": "· next {{t}}"
10111
+ "nextTickPrefix": "· next {{t}}",
10112
+ "cannotBanSelf": "Cannot ban {{ip}} — this is the host, your login, or ignoreip",
10113
+ "selfIp": "This host",
10114
+ "selfHostIp": "Host IP",
10115
+ "selfLoginIp": "Your login IP",
10116
+ "showZeroScore": "Show 0-score",
10117
+ "hideZeroScore": "Hide 0-score",
10118
+ "geoDraftOnly": "Policy is off — Save stores a draft only. Nginx will not enforce until you enable it.",
10119
+ "geoNeedDb": "GeoIP databases are missing — update the MMDB files first",
10120
+ "uaNeedZones": "Set a Cloudflare zone first",
10121
+ "selectAllCountriesWarn": "Select all countries in block-list mode? That can lock out this host and your login country.",
10122
+ "badgeRecommendPreset": "A stronger preset is recommended for the current threat",
10123
+ "badgeAutomationOn": "Automation is on",
10124
+ "badgeBanCount": "Active bans",
10125
+ "badgeGeoOn": "Geo access policy is on",
10126
+ "badgeGeoNotReady": "GeoIP database is not ready",
10127
+ "badgeIntelSignals": "Signals that currently add score",
10128
+ "signalActive": "Active",
10129
+ "signalInactive": "Inactive",
10130
+ "signalJails": "{{n}} jail(s)",
10131
+ "dbReadyHint": "MMDB files are present",
10132
+ "dbNotReadyHint": "Download a GeoIP database first",
10133
+ "staleHint": "Whether the last successful update is older than 7 days",
10134
+ "draftBadge": "Draft",
10135
+ "banIsSelf": "This IP matches the current panel source or this host.",
10136
+ "banNotSelf": "This IP is not the current panel source.",
10137
+ "geoSourceLocal": "Local GeoIP library (sapics + DB-IP)",
10138
+ "nginxPreviewHint": "Nginx snippet this preset would write (preview only):"
8959
10139
  },
8960
10140
  "publicFiles": {
8961
10141
  "notSet": "Not set",
@@ -8971,6 +10151,10 @@
8971
10151
  "siteSettings": "Site settings",
8972
10152
  "siteSettingsDesc": "Writes managed conf; may reload Nginx on apply (reachable only after apply)",
8973
10153
  "serverNameHint": "Nginx server_name, e.g. files.example.com",
10154
+ "notes": {
10155
+ "noManagedConf": "No managed Nginx conf yet — click Apply",
10156
+ "notSynced": "Managed conf exists but is not under /etc/nginx/conf.d — apply again as root with YSK_EXECUTE"
10157
+ },
8974
10158
  "quotaMiB": "Quota (MiB)",
8975
10159
  "quotaHint": "Optional; caps public directory size",
8976
10160
  "unlimited": "Unlimited",
@@ -8978,6 +10162,7 @@
8978
10162
  "appliedOk": "Public files site applied",
8979
10163
  "applyReload": "Apply and reload Nginx",
8980
10164
  "statusLive": "Live on nginx",
10165
+ "statusDraft": "Draft / not applied",
8981
10166
  "statusManagedOnly": "Managed only",
8982
10167
  "statusNotApplied": "Not applied",
8983
10168
  "nginxLive": "in conf.d",
@@ -8985,9 +10170,17 @@
8985
10170
  "openSite": "Open site",
8986
10171
  "notLiveHint": "Domain 404 usually means conf is only under dataDir, not copied to /etc/nginx/conf.d, or nginx was not reloaded. Re-apply with root + YSK_EXECUTE. Use http:// until SSL is issued for this hostname.",
8987
10172
  "diskRoot": "Disk root",
10173
+ "executeFlag": "Execute",
10174
+ "asRoot": "Root",
8988
10175
  "filesInRoot": "Entries",
8989
10176
  "managedConf": "Managed conf",
8990
- "systemConf": "System conf.d"
10177
+ "systemConf": "System conf.d",
10178
+ "autoindex": "Directory listing (autoindex)",
10179
+ "liveSystemConf": "Live system conf: {{path}}",
10180
+ "publicRootNote": "Public root: {{path}}",
10181
+ "applyConfirmTitle": "Apply public-files site?",
10182
+ "applyConfirmDesc": "Write Nginx server_name {{name}} and reload Nginx.",
10183
+ "serverNameMismatch": "Live conf uses {{live}}; the form has {{draft}}. Apply to replace."
8991
10184
  },
8992
10185
  "rbac": {
8993
10186
  "permissions": "Permissions",
@@ -9071,7 +10264,13 @@
9071
10264
  "auditExport": "Audit export",
9072
10265
  "securityApiKeysAdmin": "API keys admin",
9073
10266
  "networkBrowse": "Host-mediated web browse",
9074
- "networkVnc": "VNC remote desktop"
10267
+ "networkVnc": "VNC remote desktop",
10268
+ "validatorsRead": "Validators (read)",
10269
+ "validatorsManage": "Validators manage",
10270
+ "validatorsWipe": "Validators wipe data",
10271
+ "dockerRead": "Docker (read)",
10272
+ "dockerManage": "Docker manage",
10273
+ "dockerWipe": "Docker wipe / prune"
9075
10274
  },
9076
10275
  "aboutRoles": "Roles (factory defaults)",
9077
10276
  "aboutRolesBody": "Roles set default capabilities; users can override individual ones.",
@@ -9087,7 +10286,14 @@
9087
10286
  "capabilitiesHint": "Toggle what this role may do",
9088
10287
  "enabledCount": "{{enabled}} of {{total}} enabled",
9089
10288
  "bandAboveMax": "Above max level",
9090
- "dirtyHint": "Customized (differs from factory)"
10289
+ "roleUnavailable": "Not available for this role",
10290
+ "dirtyHint": "Customized (differs from factory)",
10291
+ "unsaved": "Unsaved",
10292
+ "unsavedHint": "Unsaved edits on this role",
10293
+ "nothingToSave": "Nothing to save",
10294
+ "saveRole": "Save {{role}} policy",
10295
+ "discardTitle": "Discard unsaved policy?",
10296
+ "discardDesc": "Switching roles drops unsaved capability edits."
9091
10297
  },
9092
10298
  "readiness": {
9093
10299
  "cat": {
@@ -9116,12 +10322,24 @@
9116
10322
  "checkFailed": "Readiness check failed",
9117
10323
  "gatePass": "Gate passed · {{pct}}%",
9118
10324
  "gateFail": "Not ready · {{pct}}%",
10325
+ "gateBlocked": "Not passed · {{n}} missing",
9119
10326
  "executeOn": "On",
9120
10327
  "executeOff": "Off",
9121
10328
  "blockers": "Blockers",
10329
+ "blockersHint": "Blockers are the critical subset of Missing — not extra checks.",
10330
+ "requireAdminTotp": "require admin 2FA policy",
10331
+ "listenBind": "listen address",
10332
+ "item": {
10333
+ "admin2fa": "Admin two-factor"
10334
+ },
10335
+ "dataDirPerms": "panel data-directory permissions",
10336
+ "mode750": "mode 750",
10337
+ "totalChecks": "All checks",
10338
+ "totalChecksHint": "Ready + degraded + missing = this total. Blockers are the critical missing subset.",
9122
10339
  "probing": "Probing…",
9123
10340
  "reprobe": "Re-probe",
9124
10341
  "exportReport": "Export report",
10342
+ "exportStarted": "Downloading {{name}}",
9125
10343
  "firstBlocker": "Fix first blocker",
9126
10344
  "viewRecommended": "View recommended",
9127
10345
  "loadingProbe": "Probing host capabilities…",
@@ -9198,7 +10416,26 @@
9198
10416
  "fixNow": "Fix now",
9199
10417
  "fixFailed": "Fix failed",
9200
10418
  "fixDone": "dataDir permissions hardened (chmod 750)",
9201
- "fixDoneWebUi": "Web UI built / installed"
10419
+ "fixDoneWebUi": "Web UI built / installed",
10420
+ "rootLabel": "Superuser",
10421
+ "techDetails": "Technical details",
10422
+ "missingOwner": "No panel owner assigned (package quota attribution)",
10423
+ "notOsProvisioned": "OS user pending (home not provisioned)",
10424
+ "isolationPendingOs": "Same as project status: OS user pending. Open Isolation to provision the system user and home.",
10425
+ "ondrejNone": "No ondrej Launchpad PHP sources detected",
10426
+ "ondrejFound": "Found legacy ondrej/php sources that conflict with packages.sury.org: {{paths}}",
10427
+ "ondrejTitle": "PHP apt source (ondrej residual)",
10428
+ "systemctlActive": "Service is running",
10429
+ "systemctlStatus": "Service status: {{status}}",
10430
+ "binInPath": "{{bin}} in PATH",
10431
+ "leftoverApache": "Apache leftover default site",
10432
+ "leftoverVsftpd": "vsftpd unit failed",
10433
+ "leftoverCli": "Stale leftover CLI",
10434
+ "leftoverNginx": "Nginx catch-all missing",
10435
+ "leftoverDovecot": "Dovecot TLS points at missing cert",
10436
+ "leftoverOther": "Host leftover",
10437
+ "leftoverApply": "Leftover apply",
10438
+ "isolationOwnerDegrades": "Missing owner_user_id affects package quota attribution — status is degraded, not ready."
9202
10439
  },
9203
10440
  "redis": {
9204
10441
  "neverExpire": "Never expires",
@@ -9230,6 +10467,8 @@
9230
10467
  "keysCountSuffix": " · {{n}} key(s)",
9231
10468
  "searchPlaceholder": "Search keys, e.g. user:* or *",
9232
10469
  "searchKeys": "Search keys",
10470
+ "scanHint": "Uses SCAN, not KEYS. Returns at most {{n}} keys — avoid * on huge databases.",
10471
+ "scanCapped": "Showing the first {{n}} matches.",
9233
10472
  "rows": "{{n}} row(s)",
9234
10473
  "content": "Content",
9235
10474
  "noMatchingKeys": "No matching keys",
@@ -9258,6 +10497,8 @@
9258
10497
  "addKey": "Add key",
9259
10498
  "dbLabel": "DB {{i}}",
9260
10499
  "keysInDb": " · {{n}} key(s)",
10500
+ "dbOptionKeys": "DB {{i}} · {{n}} keys",
10501
+ "dbOptionEmpty": "DB {{i}} · empty",
9261
10502
  "dbRange": "{{n}} databases (0–{{max}}).",
9262
10503
  "serviceLink": "Change count in service settings",
9263
10504
  "dbsWithData": "DBs with data (quick)",
@@ -9266,7 +10507,21 @@
9266
10507
  "pickKey": "Select a key on the left to view content.",
9267
10508
  "ttlPrefix": "TTL: {{ttl}}",
9268
10509
  "writeLiveHint": "Writes live Redis; cannot undo from the panel in one click.",
9269
- "refPath": "Ref: {{path}}"
10510
+ "refPath": "Ref: {{path}}",
10511
+ "dbEmptyMark": " · empty",
10512
+ "noRequirepass": "Protected mode is on, but requirepass is empty or unread — no password.",
10513
+ "insecureShort": "No password",
10514
+ "setRequirepass": "Set password",
10515
+ "rdbOnlyLossHint": "AOF is off and RDB is on. A restart or crash can lose recent writes.",
10516
+ "dirDataContainer": "/data (container)",
10517
+ "dirHostDefault": "/var/lib/redis",
10518
+ "dirDefaultInstance": "/var/lib/redis/default",
10519
+ "dirDataWarn": "/data is usually a container path; this panel cannot confirm it exists.",
10520
+ "saveOff": "Disable snapshots (not recommended)",
10521
+ "saveOffWarn": "Empty save string turns RDB snapshots off. A crash can lose all data if AOF is also off.",
10522
+ "dirMoveWarn": "Changing dir does not move dump.rdb / AOF. The next start uses the new path as-is.",
10523
+ "passwordUnset": "Not set on the service",
10524
+ "passwordSetHidden": "Set (not shown)"
9270
10525
  },
9271
10526
  "resources": {
9272
10527
  "created": "Created",
@@ -9399,6 +10654,9 @@
9399
10654
  "tuneLoadFailed": "Failed to load tuning",
9400
10655
  "availableCount": "{{n}} available",
9401
10656
  "notDetected": "Not detected",
10657
+ "binaryPath": "Binary path",
10658
+ "targetMissing": "Target not installed",
10659
+ "targetMissingHint": "Target {{version}} is not on this host. Bind an installed version or install this pin.",
9402
10660
  "target": "Target",
9403
10661
  "tune": "Tune",
9404
10662
  "loadedShort": "Loaded",
@@ -9444,6 +10702,8 @@
9444
10702
  "demoNotBind": "(hand-typed pool name) and does not auto-bind project isolation. Global php.ini is on the php.ini tab.",
9445
10703
  "applyOkWritten": "Apply success = files written. Prefer project deploy so User=project Linux user.",
9446
10704
  "applyPhpVhost": "Apply PHP vhost / pool",
10705
+ "applyPhpVhostTitle": "Needs confirm — writes pool/vhost files",
10706
+ "applyPhpVhostDesc": "Will write the {{pool}} pool and {{domain}} vhost. Reload services: {{reload}}.",
9447
10707
  "reprobeTools": "Re-probe tools",
9448
10708
  "pressReprobe": "Press Re-probe tools to load",
9449
10709
  "installNodeLabel": "Install Node {{v}}",
@@ -9697,7 +10957,8 @@
9697
10957
  "tabProcesses": "Processes",
9698
10958
  "pm2": {
9699
10959
  "title": "PM2 fleet",
9700
- "desc": "Read-only view of pm2 jlist (panel user PM2_HOME). Live SSE refreshes every 2s.",
10960
+ "desc": "PM2 is a process manager. This tab lists the panel user’s processes (read-only). Live updates use SSE (server-sent events) about every 2 seconds.",
10961
+ "glossary": "PM2 = process manager; SSE = live stream.",
9701
10962
  "live": "Live",
9702
10963
  "installed": "PM2 installed",
9703
10964
  "version": "pm2 version",
@@ -9734,15 +10995,44 @@
9734
10995
  "projectsCount": "YSK projects",
9735
10996
  "noProjects": "No projects",
9736
10997
  "noProjectsDesc": "No node/bun projects in the panel, or OS user not provisioned.",
9737
- "pm2OnlyDesc": "Only apps started with PM2 under the panel user. systemd deploys appear above."
10998
+ "pm2OnlyDesc": "Only apps started with PM2 under the panel user. systemd deploys appear above.",
10999
+ "startupTitle": "Start on boot",
11000
+ "startupDesc": "Register PM2 so processes come back after reboot.",
11001
+ "systemdActionsHint": "systemd actions need root and YSK_EXECUTE.",
11002
+ "startupOk": "Startup registered. {{notes}}",
11003
+ "startupFail": "Could not register startup. {{notes}}",
11004
+ "actionOk": "{{action}} {{name}} — {{notes}}",
11005
+ "actionFail": "Could not {{action}} {{name}}. {{notes}}",
11006
+ "startupReady": "Ready",
11007
+ "startupReadyYes": "Yes",
11008
+ "startupReadyNo": "No",
11009
+ "startupUnit": "Unit",
11010
+ "startupDump": "Dump",
11011
+ "startupInstall": "Install startup",
11012
+ "startupSave": "Save process list",
11013
+ "actRestart": "Restart",
11014
+ "actStop": "Stop",
11015
+ "actReload": "Reload",
11016
+ "pm2ActionsHint": "PM2 actions apply to the panel user’s process list only.",
11017
+ "noteUnparsed": "PM2 list could not be parsed (empty or unexpected output).",
11018
+ "notePanelUserOnly": "PM2 list is for the panel process user only.",
11019
+ "noteProjectUnits": "{{n}} YSK project unit(s) listed"
9738
11020
  },
9739
11021
  "recordedInstalled": "Recorded {{v}}",
9740
11022
  "remoteSourceSuffix": " ({{source}})",
9741
11023
  "nodePathYskMissingTitle": "Managed Node path not ready",
9742
11024
  "nodePathYskMissing": "YSK-managed Node for version {{version}} is not ready. Re-probe or reinstall.",
11025
+ "managedPathMissingTitle": "Managed {{name}} path not ready",
11026
+ "managedPathMissing": "YSK-managed {{name}} for version {{version}} is not ready. Re-probe or reinstall.",
9743
11027
  "nodePathUnsafeTitle": "Node path is unsafe",
9744
11028
  "nodePathUnsafe": "Path {{path}} is outside the managed tree; project deploys may fail.",
9745
11029
  "recordedButProbeEmpty": "Panel recorded install {{v}}, but the host probe found no binary. Not installed — re-probe or reinstall.",
11030
+ "installedLabel": "Installed",
11031
+ "installedHint": "Host probe result — not the control-plane record",
11032
+ "targetHint": "Version this page will install or pin",
11033
+ "panelDefaultHint": "New projects prefer panel default {{version}} (host CLI may differ).",
11034
+ "rebuildFromHost": "Rebuild record from host",
11035
+ "rebuiltFromHost": "Record refreshed from host probe",
9746
11036
  "tabTuning": "Tuning",
9747
11037
  "versionPlaceholder": "Latest,",
9748
11038
  "pluginsBundleWithRuntime": "Tools「Install runtime」Install(Install)。",
@@ -9770,7 +11060,6 @@
9770
11060
  "setPanelDefault": "Set as panel default",
9771
11061
  "alreadyPanelDefault": "Panel default · {{version}}",
9772
11062
  "panelDefaultSaved": "Panel default set to {{version}}",
9773
- "panelDefaultHint": "New projects prefer panel default {{version}} (host CLI may differ).",
9774
11063
  "panelDefaultExplain": "Panel default = preferred version for new sites/projects. Host default = system CLI (php/python/node…).",
9775
11064
  "stackReadyTitle": "{{name}} stack ready",
9776
11065
  "softwareIntro": "Manage installed versions, host CLI default, and the version preferred for new projects.",
@@ -9788,7 +11077,20 @@
9788
11077
  "path": "Path",
9789
11078
  "fullVersion": "Full version",
9790
11079
  "useListForDefaults": "To change host or panel default, or remove this version, use the list above.",
9791
- "alreadyHostDefaultShort": "Host default"
11080
+ "alreadyHostDefaultShort": "Host default",
11081
+ "installRecordedCta": "Install recorded {{v}}",
11082
+ "needsInstall": "needs install",
11083
+ "needsInstallHint": "Not on this host. Install it first, or pick an installed version.",
11084
+ "unitBytes": "bytes",
11085
+ "headerSizeKb": "{{n}} KB",
11086
+ "phpIniChipEmpty": "Not loaded — open the php.ini tab",
11087
+ "phpFpmService": "PHP-FPM",
11088
+ "phpFpmServiceDesc": "Start, stop, reload, or restart the PHP-FPM unit",
11089
+ "rustupDefaultMissingTitle": "No rustup default toolchain",
11090
+ "rustupDefaultMissing": "rustup has no default toolchain. Set one (stable) on the Software tab.",
11091
+ "rustupDefaultMissingShort": "No default toolchain",
11092
+ "rustupSetDefaultHint": "Set default toolchain",
11093
+ "uninstalledCountHint": "{{n}} version(s) not on this host"
9792
11094
  },
9793
11095
  "search": {
9794
11096
  "placeholder": "Search pages & resources…",
@@ -9812,6 +11114,10 @@
9812
11114
  "cron": "Cron",
9813
11115
  "user": "Users",
9814
11116
  "other": "Other"
11117
+ },
11118
+ "alias": {
11119
+ "ssl": "cert certificate certs",
11120
+ "projects": "project sites"
9815
11121
  }
9816
11122
  },
9817
11123
  "security": {
@@ -9825,8 +11131,12 @@
9825
11131
  "pillReady": "Ready",
9826
11132
  "pill2faOff": "2FA off",
9827
11133
  "stat2fa": "2FA",
9828
- "statApi": "API",
11134
+ "statApi": "API keys",
11135
+ "statApiSessions": "API sessions",
11136
+ "revokeOtherTitle": "Sign out {{n}} other session(s)",
9829
11137
  "statSsh": "SSH",
11138
+ "statSshValue": "{{keys}} keys · {{auth}} authorized",
11139
+ "statSshHint": "Outbound identities / authorized login keys",
9830
11140
  "statPending": "Pending",
9831
11141
  "on": "On",
9832
11142
  "off": "Off",
@@ -9835,7 +11145,7 @@
9835
11145
  "tabApiKeys": "API keys",
9836
11146
  "tabSsh": "SSH",
9837
11147
  "tabApprovals": "Approvals",
9838
- "tabAllowlist": "Allowlist",
11148
+ "tabAllowlist": "Agent tools",
9839
11149
  "apiTokenOnce": "API token (shown once):",
9840
11150
  "copiedToken": "Token copied",
9841
11151
  "totpTitle": "Two-factor (TOTP)",
@@ -9919,8 +11229,9 @@
9919
11229
  "revokeAllDevices": "Revoke all devices",
9920
11230
  "revokedAllDevices": "All trusted devices revoked",
9921
11231
  "export2faBackup": "Export 2FA encrypted backup",
9922
- "fail2banSnippetMsg": "Fail2ban snippets: {{written}} — {{notes}}",
9923
- "generateFail2ban": "Generate Fail2ban snippets",
11232
+ "fail2banSnippetMsg": "fail2ban snippets: {{written}} — {{notes}}",
11233
+ "generatefail2ban": "Generate fail2ban snippets",
11234
+ "generateFail2ban": "Generate fail2ban snippets",
9924
11235
  "adminPolicyTitle": "Admin 2FA policy",
9925
11236
  "adminPolicyDesc": "",
9926
11237
  "requireAdmin2fa": "Require admin 2FA",
@@ -9940,8 +11251,9 @@
9940
11251
  "apiKeysEmpty": "No API keys yet",
9941
11252
  "apiKeysEmptyHint": "Create from the toolbar; then call API with Bearer token",
9942
11253
  "approve": "Approve",
9943
- "allowlistTitle": "Allowlist ({{count}})",
9944
- "allowlistEmpty": "No allowlist tools",
11254
+ "allowlistTitle": "Agent tools ({{count}})",
11255
+ "allowlistEmpty": "No agent tools in the catalog",
11256
+ "totpStatusLoadFailed": "Could not load 2FA status",
9945
11257
  "createApiKeyTitle": "Create API key",
9946
11258
  "createApiKeyDesc": "Full token is shown only once after create",
9947
11259
  "createKeyBtn": "Create key",
@@ -10015,7 +11327,9 @@
10015
11327
  "commentOptional": "Comment (optional)",
10016
11328
  "commentPlaceholder": "laptop / CI",
10017
11329
  "loginNeedProject": "Create a project first. Binding works best when the system user is ready.",
10018
- "loginNeedPub": "Select a project and paste a public key starting with ssh-",
11330
+ "loginNeedPub": "Select a project or Linux user, and paste a public key starting with ssh-",
11331
+ "loginNoProjects": "No projects. Authorize an existing Linux user (root / tester) below. Writing /root/.ssh needs YSK_EXECUTE=1.",
11332
+ "loginLinuxHint": "Used when no project. Example: root or tester.",
10019
11333
  "loginAdded": "Added",
10020
11334
  "sshdTitle": "Project user SFTP (sshd)",
10021
11335
  "sshdDesc": "Let ysks_* / ysk_* project users SFTP with public keys",
@@ -10139,6 +11453,14 @@
10139
11453
  "ssh2faStep3": "Write home file",
10140
11454
  "ssh2faStep4": "Install PAM module and merge snippets (below)",
10141
11455
  "pkgLabel": "Package {{name}}",
11456
+ "pkgStatus": "Package {{status}}",
11457
+ "pamStatus": "PAM {{status}}",
11458
+ "kbdStatus": "sshd keyboard-interactive {{status}}",
11459
+ "light": {
11460
+ "green": "ok",
11461
+ "yellow": "check",
11462
+ "red": "missing"
11463
+ },
10142
11464
  "enrollForUser": "Enroll SSH 2FA for user",
10143
11465
  "ssh2faEmpty": "No Linux user has SSH 2FA yet",
10144
11466
  "ssh2faEmptyHint": "Prefer key login first;",
@@ -10183,7 +11505,13 @@
10183
11505
  "sharePanelTitle": "Share panel TOTP secret?",
10184
11506
  "sharePanelDesc": "High risk. Type SHARED to confirm.",
10185
11507
  "confirmString": "Confirmation string",
10186
- "enableShare": "Enable sharing"
11508
+ "enableShare": "Enable sharing",
11509
+ "invalidPub": "Paste a full OpenSSH public key line (ssh-ed25519 / ssh-rsa / ecdsa…).",
11510
+ "dryRunOk": "Dry-run finished. Review the preview below.",
11511
+ "strictDryRun": "Strict preview (dry-run)",
11512
+ "errorNoDetail": "Test failed (no details)",
11513
+ "strictBlocked": "Package or PAM is not ready; Strict apply is disabled.",
11514
+ "privCloseWithoutAck": "Closed. The private key will not be shown again; generate a new one if you did not save it."
10187
11515
  },
10188
11516
  "sessionsActive": "Active sessions",
10189
11517
  "sessionsOther": "Other devices",
@@ -10206,7 +11534,44 @@
10206
11534
  "revokeOthersDesc": "This will end {{count}} other session(s). Your current browser stays signed in.",
10207
11535
  "sessionRevoked": "Session signed out",
10208
11536
  "mySecurityHint": "",
10209
- "policyTotpHint": "Site policy: each admin must enable their own 2FA (individual QR)"
11537
+ "policyTotpHint": "Site policy: each admin must enable their own 2FA (individual QR)",
11538
+ "requireUser2fa": "Require 2FA for all panel users",
11539
+ "changePasswordTitle": "Change sign-in password",
11540
+ "currentPassword": "Current password",
11541
+ "newPassword": "New password",
11542
+ "confirmNewPassword": "Confirm new password",
11543
+ "passwordMismatch": "New passwords do not match.",
11544
+ "changePassword": "Change password",
11545
+ "passwordChanged": "Password updated.",
11546
+ "strictNeedsEnrolled": "Enable 2FA on this admin account before turning on Strict.",
11547
+ "policyTotpNeedSelf": "Enable 2FA on this account first; the confirm code cannot be filled otherwise.",
11548
+ "policyNoTotpHint": "This account has no 2FA yet. Turn on 2FA above before requiring it for admins or all users — otherwise you can lock everyone out.",
11549
+ "policyNeedSelf2fa": "Enable 2FA on this account first, then confirm with a TOTP code",
11550
+ "revokeAllDevicesTitle": "Revoke every remembered device — you and other admins must verify 2FA again",
11551
+ "sessionCli": "CLI",
11552
+ "sessionApi": "API",
11553
+ "fail2banSnippetTitle": "fail2ban snippet",
11554
+ "fail2banSnippetEmpty": "No snippet was written.",
11555
+ "trustedDevicesTitle": "Trusted devices",
11556
+ "noTrustedDevices": "No trusted devices.",
11557
+ "strictConfirmTitle": "Turn on Strict 2FA?",
11558
+ "strictConfirmDesc": "Users without 2FA will be refused sign-in. Confirm you already have a working TOTP or passkey.",
11559
+ "revokeDevicesTitle": "Revoke trusted devices?",
11560
+ "revokeDevicesDesc": "Remembered browsers will need 2FA again.",
11561
+ "approvalsHint": "Approvals appear when a high-risk tool needs a second operator. Grant Review approvals and Handle approvals on Users → Permissions.",
11562
+ "allowlistReadonly": "Read-only catalog of agent tools. Capability grants are configured on Users → Permissions.",
11563
+ "colTool": "Tool",
11564
+ "colAllowed": "Allowed",
11565
+ "colRisk": "Risk",
11566
+ "colApproval": "Approval",
11567
+ "risk": {
11568
+ "low": "Low",
11569
+ "medium": "Medium",
11570
+ "high": "High",
11571
+ "critical": "Critical"
11572
+ },
11573
+ "confirmDeleteApiKey": "Delete this API key?",
11574
+ "confirmDeleteApiKeyDesc": "“{{name}}” will stop authenticating. This cannot be undone."
10210
11575
  },
10211
11576
  "serviceExposure": {
10212
11577
  "title": "Network access",
@@ -10217,11 +11582,22 @@
10217
11582
  "modePrivate": "Local only",
10218
11583
  "modePublic": "Public",
10219
11584
  "modeRestricted": "Restricted",
11585
+ "modeUndecided": "Not set",
11586
+ "modePublicLive": "Public (live bind)",
11587
+ "summaryPublicLive": "Listening on {{bind}} — reachable on all interfaces. Confirm access mode; this is not private.",
11588
+ "modeLoading": "Loading",
10220
11589
  "summaryPrivate": "Not open on the public firewall.",
10221
11590
  "summaryPublic": "Open · {{ports}}",
11591
+ "summaryUndecided": "Access mode not confirmed (catalog default: {{suggested}}).",
11592
+ "summaryNotEnforced": "Firewall is off — the panel is not opening or blocking these ports.",
11593
+ "roleSmtp": "SMTP submission",
11594
+ "roleImap": "IMAP / POP3 mailbox",
10222
11595
  "summaryRestricted": "Restricted · {{count}} source(s)",
10223
11596
  "summaryFirewallOff": "Host firewall: {{detail}} — rules not enforced until UFW is active.",
11597
+ "summaryFirewallOffOnly": "Host firewall is not enabled, so port rules are not enforced.",
10224
11598
  "outOfSync": "Out of sync",
11599
+ "openButStopped": "Ports open — service not running",
11600
+ "openNoTenants": "Public ports with no tenants",
10225
11601
  "firewallOff": "Firewall off",
10226
11602
  "ufwMissing": "UFW not installed",
10227
11603
  "ufwInactive": "inactive",
@@ -10237,18 +11613,76 @@
10237
11613
  "restrictedNeedSource": "Add at least one IP/CIDR or country code for restricted mode.",
10238
11614
  "privateStartTitle": "Expose {{service}} on the network?",
10239
11615
  "confirmAndStart": "Confirm and start",
10240
- "cloudSgNote": "Host firewall only — cloud security groups (AWS/GCP/Azure) are not changed."
11616
+ "cloudSgNote": "Host firewall only — cloud security groups (AWS/GCP/Azure) are not changed.",
11617
+ "serviceNotInstalled": "This service is not installed, so firewall rules do not apply."
10241
11618
  },
10242
11619
  "services": {
10243
11620
  "enabledBoot": "On boot",
11621
+ "unitNotFound": "Not installed",
11622
+ "bootNa": "Not applicable",
11623
+ "unitNa": "Not applicable",
11624
+ "permLabel": "Permission",
11625
+ "permCanChange": "Can change the system (superuser)",
11626
+ "permBlocked": "Cannot change the system",
11627
+ "permHint": "System change {{exec}} · Superuser {{root}}",
11628
+ "clusterLegend": "Planned = saved in the panel, not applied on the host.",
11629
+ "active": {
11630
+ "active": "Running",
11631
+ "inactive": "Stopped",
11632
+ "not-found": "Not installed",
11633
+ "failed": "Failed",
11634
+ "tool": "Tool",
11635
+ "activating": "Starting"
11636
+ },
11637
+ "unitStatic": "static",
11638
+ "unitIndirect": "indirect",
10244
11639
  "action": {
10245
11640
  "start": "Start",
10246
11641
  "stop": "Stop",
10247
11642
  "restart": "Restart",
10248
- "reload": "Reload"
10249
- },
11643
+ "reload": "Reload",
11644
+ "enable": "Enable on boot",
11645
+ "disable": "Disable on boot"
11646
+ },
11647
+ "enabledOk": "{{label}} enabled on boot",
11648
+ "bootDisabledWarn": "{{label}} is running but will not start at boot. Enable it to persist across reboot.",
11649
+ "bootDisabledShort": "Not on boot",
11650
+ "sshdBootOffWarn": "sshd is not enabled on boot. After reboot this host will have no SSH rescue path.",
11651
+ "mariadbNotInstalled": "MariaDB is not installed",
11652
+ "mariadbNotInstalledMysqlOk": "Not installed: MariaDB (MySQL is installed)",
11653
+ "lifecycleTitle": "{{label}} service control",
11654
+ "startedOk": "{{label}} started",
11655
+ "stoppedOk": "{{label}} stopped",
11656
+ "needRunning": "{{label}} is not running",
11657
+ "restartedOk": "{{label}} restarted",
11658
+ "reloadedOk": "{{label}} reloaded",
11659
+ "stopNeedConfirm": "Needs confirmation",
11660
+ "stopNeedConfirmPhrase": "Needs confirmation phrase",
11661
+ "stopConfirmTitle": "Stop {{label}}?",
11662
+ "stopConfirmDesc": "{{label}} will stop listening. Start it again from this page when needed.",
11663
+ "stopConfirmEdgeDesc": "Stopping {{label}} takes sites and reverse-proxy traffic offline until it is started again.",
11664
+ "stopConfirmEdgeConsequence": "HTTP/HTTPS on this host will not be served while {{label}} is stopped.",
11665
+ "stopConfirmSshdTitle": "Stop sshd?",
11666
+ "stopConfirmSshdDesc": "Stopping sshd closes remote SSH. Confirm you still have a console or another login path.",
11667
+ "stopConfirmSshdToken": "stop sshd",
11668
+ "stopConfirmSshdConsequence": "New SSH sessions will fail until sshd is started from the host console.",
11669
+ "stopConfirmPanelTitle": "Stop YSK Server?",
11670
+ "stopConfirmPanelDesc": "The panel and API will go offline until the unit is started on the host.",
11671
+ "restartConfirmPanelTitle": "Restart YSK Server?",
11672
+ "restartConfirmPanelDesc": "The panel and API will drop briefly while the unit restarts.",
11673
+ "stopConfirmPanelToken": "stop ysk-server",
11674
+ "stopConfirmPanelConsequence": "This browser session will disconnect. Start the unit from SSH or the host console.",
11675
+ "stopConfirmFail2banTitle": "Stop fail2ban?",
11676
+ "stopConfirmFail2banDesc": "Stopping fail2ban turns off automatic IP bans. Websites and SSH keep running.",
11677
+ "stopConfirmFail2banConsequence": "New attackers are not banned until fail2ban is started again.",
10250
11678
  "actionDone": "{{action}} done",
10251
11679
  "runningOf": "{{running}}/{{total}} running",
11680
+ "statusFilter": {
11681
+ "all": "All states",
11682
+ "running": "Running",
11683
+ "failed": "Failed",
11684
+ "missing": "Not installed"
11685
+ },
10252
11686
  "canMutate": "Mutable",
10253
11687
  "locked": "Locked",
10254
11688
  "controlUnit": "Control-plane unit",
@@ -10262,7 +11696,7 @@
10262
11696
  "matrixTab": "Service matrix ({{count}})",
10263
11697
  "stackTab": "Software stack",
10264
11698
  "stackTitle": "Host software stack",
10265
- "stackHint": "Install or remove host components by plan; SQL server engines are exclusive.",
11699
+ "stackHint": "Software plans install OS packages. The service matrix tab lists systemd units — the two counts are not the same set.",
10266
11700
  "protectionTab": "Protection probe",
10267
11701
  "knownServices": "Known services",
10268
11702
  "showing": "Showing {{shown}} / {{total}}",
@@ -10272,6 +11706,7 @@
10272
11706
  "bootPrefix": "Boot {{state}}",
10273
11707
  "controlPage": "Control page",
10274
11708
  "manageRuntime": "Install / update",
11709
+ "installOrOpen": "Install / open",
10275
11710
  "protectionTitle": "Protection probe",
10276
11711
  "protectionSub": "Read-only; does not change firewall / fail2ban",
10277
11712
  "protectionDoneNote": "Protection probe finished",
@@ -10368,7 +11803,8 @@
10368
11803
  "pick": "Pick version",
10369
11804
  "noTarget": "No update target",
10370
11805
  "needRuntimePage": "Install this version on the runtime page",
10371
- "noAptCandidate": "No apt candidate version"
11806
+ "noAptCandidate": "No apt candidate version",
11807
+ "sourceLabel": "Source"
10372
11808
  },
10373
11809
  "install": {
10374
11810
  "progress": "Installing: {{list}}…",
@@ -10465,6 +11901,8 @@
10465
11901
  "vnc": "VNC services will stop",
10466
11902
  "controlPlane": "Control plane runtime (protected)",
10467
11903
  "generic": "Related services may stop",
11904
+ "containers": "Running containers will stop",
11905
+ "validators": "Validator node stacks that use Docker Compose will stop",
10468
11906
  "purgeData": "Data paths will be deleted",
10469
11907
  "protectedSkipped": "Protected components are skipped",
10470
11908
  "runtimeStack": "All panel-managed versions of this runtime will be removed"
@@ -10474,7 +11912,15 @@
10474
11912
  "dockCancelling": "Cancelling · {{title}}",
10475
11913
  "dockCancelled": "Cancelled · {{title}}",
10476
11914
  "cancelHint": "Cancel requested. The client stopped listening; the host may finish the current apt/step. Re-probe status after a moment.",
10477
- "cancelledToast": "Operation cancelled (client stopped streaming)"
11915
+ "cancelledToast": "Operation cancelled (client stopped streaming)",
11916
+ "kindApply": "Apply",
11917
+ "kindScan": "Scan",
11918
+ "kindDeploy": "Deploy",
11919
+ "kindRuntime": "Runtime",
11920
+ "jobDone": "Finished · {{title}}",
11921
+ "jobFailed": "Failed · {{title}}",
11922
+ "uninstallUfwWarn": "Removing UFW leaves this host without its panel-managed port firewall.",
11923
+ "uninstallFail2banWarn": "Removing fail2ban stops jails and releases current bans. Add your login IP to ignoreip first if you keep it."
10478
11924
  },
10479
11925
  "sqlEngineHealth": {
10480
11926
  "finding": {
@@ -10607,6 +12053,8 @@
10607
12053
  },
10608
12054
  "pillCount": "{{count}} cert(s)",
10609
12055
  "statCerts": "Certificates",
12056
+ "panelCertHint": "Panel HTTPS uses {{path}} (expires {{exp}}). It is not listed as a site certificate.",
12057
+ "openPanelTls": "Open panel HTTPS",
10610
12058
  "statWithFiles": "With files",
10611
12059
  "statBindings": "Bindings",
10612
12060
  "statFailed": "Failed",
@@ -10662,6 +12110,9 @@
10662
12110
  "filesYes": "Yes",
10663
12111
  "filesNo": "No",
10664
12112
  "colExpires": "Expires",
12113
+ "renew": "Renew",
12114
+ "renewFor": "Renew {{domain}}",
12115
+ "deleteDomain": "Delete {{domain}}",
10665
12116
  "colStatus": "Status",
10666
12117
  "emptyTitle": "No certificates yet",
10667
12118
  "emptyDesc": "Use “Upload certificate” or “Request Let’s Encrypt” above",
@@ -10684,17 +12135,27 @@
10684
12135
  "leHttp01Hint": "Normal domains use http-01 (nginx plugin)",
10685
12136
  "deleteTitle": "Delete certificate?",
10686
12137
  "deleteDesc": "Removes cert files and registration for {{domain}}.",
12138
+ "deleteNeedDomain": "Delete this certificate — type the domain name to confirm",
10687
12139
  "savedCert": "Saved certificate for {{domain}}",
10688
12140
  "uploadFailed": "Upload failed",
10689
12141
  "requestBlocked": "Cannot complete certificate request in the admin panel",
10690
12142
  "requestDone": "Certificate request completed",
10691
12143
  "requestFailed": "Certificate request did not succeed",
10692
12144
  "applyFailed": "Request failed",
10693
- "deletedCert": "Deleted {{domain}}"
12145
+ "deletedCert": "Deleted {{domain}}",
12146
+ "uninstallCertbotWarn": "Removing certbot stops automatic renewal of existing Let's Encrypt certificates.",
12147
+ "uninstallCertbot": "Uninstall certbot (loses auto-renew)",
12148
+ "domainRequired": "Please enter a domain.",
12149
+ "domainInvalid": "Domain format is not valid.",
12150
+ "domainKnownHint": "Pick a known project, DNS, or mail domain, or type a custom name."
10694
12151
  },
10695
12152
  "stackWizard": {
10696
12153
  "purgeConfirm": "Confirm purge? Registered data paths (databases/mail) will be deleted permanently.",
10697
- "installedCount": "Installed {{installed}} · Missing {{missing}}",
12154
+ "installedCount": "Packages installed {{installed}} · missing {{missing}}",
12155
+ "countHint": "These counts are OS packages in the software plan — not the service-matrix units on the other tab.",
12156
+ "executeRoot": "System changes {{execute}} · administrator {{root}}",
12157
+ "manifestPlan": "Plan {{plan}} ({{bundles}})",
12158
+ "manifestHint": "Last chosen software plan and bundles",
10698
12159
  "needRootExecute": "Live install/remove needs administrator rights and system-change permission. You can still dry-run.",
10699
12160
  "modeInstall": "Install plan",
10700
12161
  "modeUninstall": "Uninstall",
@@ -10709,7 +12170,10 @@
10709
12170
  "dataPolicy": "Data policy",
10710
12171
  "keepData": "Keep data",
10711
12172
  "purgeData": "Purge data",
10712
- "uninstallNow": "Uninstall now"
12173
+ "uninstallNow": "Uninstall now",
12174
+ "uninstallNeedSelect": "Select at least one bundle. Empty selection no longer means remove all.",
12175
+ "uninstallConfirmTitle": "Remove selected bundles?",
12176
+ "uninstallConfirmDesc": "{{count}} bundle(s) will be removed. Type REMOVE to confirm."
10713
12177
  },
10714
12178
  "support": {
10715
12179
  "title": "Support",
@@ -10737,7 +12201,23 @@
10737
12201
  "cryptoNetwork": "Network",
10738
12202
  "cryptoAddress": "Address",
10739
12203
  "copy": "Copy",
10740
- "copied": "Copied"
12204
+ "copied": "Copied",
12205
+ "copyTitle": "Copy {{address}}",
12206
+ "docsLink": "Documentation",
12207
+ "diagTitle": "Diagnostic summary",
12208
+ "diagBody": "Copy version, system-change, superuser, and host facts to paste into an email. This is not a full log bundle.",
12209
+ "diagCopy": "Copy diagnostic summary",
12210
+ "diagCopied": "Diagnostic summary copied",
12211
+ "diagCopyTitle": "Copy version, system-change, and host facts",
12212
+ "diagPreview": "Preview what will be copied",
12213
+ "diagLoading": "Loading diagnostic…",
12214
+ "diagLoadFailed": "Could not load diagnostic",
12215
+ "copiedAddr": "Copied {{addr}}",
12216
+ "diagStatus": "Status",
12217
+ "diagMode": "Mode",
12218
+ "diagProtection": "Protection",
12219
+ "diagHostname": "Hostname",
12220
+ "diagOs": "OS"
10741
12221
  },
10742
12222
  "system": {
10743
12223
  "exportLoadFailed": "Failed to load export data",
@@ -10769,7 +12249,10 @@
10769
12249
  "prettyPh": "Friendly display name",
10770
12250
  "timezone": "Timezone",
10771
12251
  "timezoneHint": "Choose an IANA timezone from the list (e.g. Asia/Hong_Kong)",
12252
+ "timezoneNow": "Host time now: {{time}} ({{tz}})",
12253
+ "timezoneBrowserDiff": "This host uses {{host}}; your browser uses {{browser}}. Changing timezone here changes the host clock, not the browser.",
10772
12254
  "timezoneSelect": "Select timezone",
12255
+ "notExported": "Not exported yet",
10773
12256
  "dns": "DNS",
10774
12257
  "updated": "Updated",
10775
12258
  "applyIdentity": "Apply identity",
@@ -10780,9 +12263,9 @@
10780
12263
  "panelSsl": "Panel SSL",
10781
12264
  "panelTls": {
10782
12265
  "title": "Panel HTTPS",
10783
- "sub": "Control plane (ysk-server) serves TLS on listenPort; WebAuthn/Passkeys need HTTPS",
12266
+ "sub": "Control plane (ysk-server) serves TLS on the configured port; WebAuthn/Passkeys need HTTPS",
10784
12267
  "domain": "Panel domain",
10785
- "domainHint": "Used for certificate issue/bind, e.g. demo.ysk.hk",
12268
+ "domainHint": "Used for certificate issue/bind, e.g. {{host}}",
10786
12269
  "email": "Let’s Encrypt email",
10787
12270
  "status": "Status",
10788
12271
  "enabled": "TLS enabled in config",
@@ -10794,6 +12277,7 @@
10794
12277
  "issueEnable": "Issue cert & enable HTTPS",
10795
12278
  "enableExisting": "Enable with existing cert",
10796
12279
  "disable": "Disable panel HTTPS",
12280
+ "disableNeedConfirm": "Needs confirmation — type DISABLE-HTTPS",
10797
12281
  "needDomain": "Enter hostname / domain first",
10798
12282
  "urlHint": "After restart open {{url}}",
10799
12283
  "certMissing": "TLS enabled but cert/key files missing",
@@ -10818,7 +12302,16 @@
10818
12302
  "leOk": "Let’s Encrypt certificate obtained for {{domain}}",
10819
12303
  "leFailed": "Certificate request failed: {{detail}}",
10820
12304
  "leHint": "Ensure DNS A points here and port 80 is reachable (or nginx serves the domain)",
10821
- "openFirewall": "If public: allow panel port {{port}}/tcp (Firewall → open port → 9287 Panel)"
12305
+ "openFirewall": "If public: allow panel port {{port}}/tcp (Firewall → open port → 9287 Panel)",
12306
+ "disableConfirmTitle": "Disable panel HTTPS?",
12307
+ "disableConfirmDesc": "The panel will serve HTTP. WebAuthn / Passkey will stop working until HTTPS is on again.",
12308
+ "disablePasskeyWarn": "Registered passkeys need HTTPS — they will fail on HTTP.",
12309
+ "listenPublic": "Panel is listening on a public address (0.0.0.0/::). Restrict with a firewall or bind to 127.0.0.1.",
12310
+ "bootstrapCert": "This is the self-signed bootstrap certificate — browsers will warn. Issue a trusted certificate for the panel domain.",
12311
+ "cliNoSocket": "CLI has no live HTTP socket; servingHttps is inferred from config and listen sockets (ss).",
12312
+ "listenHost": "Listen address",
12313
+ "currentHost": "This session",
12314
+ "replaceCert": "Replace with a trusted certificate"
10822
12315
  },
10823
12316
  "timeNtp": "Time & NTP",
10824
12317
  "clockStatus": "System clock status",
@@ -10860,6 +12353,9 @@
10860
12353
  "powerTitle": "Power (danger zone)",
10861
12354
  "powerWarn": "Reboot/poweroff interrupts all services and the panel. The panel cannot power the host on — needs physical access or hypervisor.",
10862
12355
  "unlocked": "Unlocked",
12356
+ "powerUnlock": "Unlock danger zone",
12357
+ "powerLock": "Lock danger zone",
12358
+ "noScheduledPower": "No reboot or poweroff is scheduled",
10863
12359
  "powerCaps": "Needs YSK_EXECUTE=1 and root. Now EXECUTE={{exec}}, root={{root}}.",
10864
12360
  "scheduledPower": "Scheduled poweroff/reboot detected",
10865
12361
  "cancelScheduleHint": ". Use “Cancel schedule” to withdraw.",
@@ -10901,6 +12397,7 @@
10901
12397
  "syncToSystem": "Sync to system",
10902
12398
  "syncSub": "Copy to /etc/nginx/conf.d and reload — needs root + EXECUTE",
10903
12399
  "syncReload": "Sync + reload",
12400
+ "syncReloadNeedConfirm": "Needs confirmation — writes /etc/nginx/conf.d and reloads Nginx",
10904
12401
  "exportOnly": "Export only + list conf",
10905
12402
  "dryRun": "Dry-run",
10906
12403
  "dryRunNote": "Dry-run does not change the system.",
@@ -10914,8 +12411,8 @@
10914
12411
  "syncConfirmDesc": "Sync managed Nginx conf to /etc/nginx/conf",
10915
12412
  "uptime": "Uptime",
10916
12413
  "load1m": "Load 1m",
10917
- "executeLabel": "EXECUTE",
10918
- "rootLabel": "Root",
12414
+ "executeLabel": "System change",
12415
+ "rootLabel": "Superuser",
10919
12416
  "managedLabel": "Managed",
10920
12417
  "managedCount": "Managed",
10921
12418
  "exportsCount": "Exports",
@@ -10923,7 +12420,14 @@
10923
12420
  "exportPath": "Export path",
10924
12421
  "mode": "Mode",
10925
12422
  "managedConf": "Managed conf",
10926
- "dryRunFlag": "Dry-run"
12423
+ "dryRunFlag": "Dry-run",
12424
+ "timezoneSearch": "Filter timezones…",
12425
+ "resyncNtp": "Re-sync NTP",
12426
+ "storageSub": "Disk usage",
12427
+ "nginxLeftover": "Leftover",
12428
+ "nginxUnused": "Unused",
12429
+ "nginxLeftoverHint": "Stale public-files or leftover conf. Still included in sync until you remove or replace it.",
12430
+ "nginxUnusedHint": "Stock / catch-all conf (000-default). Still included in sync until you act."
10927
12431
  },
10928
12432
  "systemd": {
10929
12433
  "enabled": "Enabled",
@@ -10997,6 +12501,8 @@
10997
12501
  "policyNotEqualFull": "Write template ≠ service enabled ≠ listening",
10998
12502
  "controlPlaneUnit": "Control-plane unit",
10999
12503
  "kpiRuntime": "Runtime",
12504
+ "rawStateHint": "Raw unit state in tooltip",
12505
+ "bootHint": "Whether the unit starts at boot",
11000
12506
  "kpiBoot": "Boot enable",
11001
12507
  "kpiCaps": "Apply capability",
11002
12508
  "capsReady": "Can install to system",
@@ -11042,8 +12548,12 @@
11042
12548
  "error": "Terminal error",
11043
12549
  "wsError": "WebSocket failed",
11044
12550
  "exitCode": "Exit code {{code}}",
11045
- "needRootExecute": "Requires root + YSK_EXECUTE=1 for system shells.",
12551
+ "needRootExecute": "System shells need superuser and system-change permission.",
12552
+ "groupSystem": "System",
12553
+ "groupProject": "Project",
11046
12554
  "unavailable": "unavailable",
12555
+ "copyAll": "Copy all",
12556
+ "copyAllNeedConn": "Connect first — the buffer is empty while disconnected",
11047
12557
  "placeholder": "Pick an identity, then Connect",
11048
12558
  "aboutTitle": "About terminal",
11049
12559
  "aboutSub": "Interactive OS shell in the browser (local users). Not an arbitrary remote SSH client.",
@@ -11057,7 +12567,11 @@
11057
12567
  "stepUpHint": "Root login requires 2FA step-up when your account has TOTP enabled.",
11058
12568
  "stepUpTitle": "Confirm root shell",
11059
12569
  "stepUpDesc": "Enter your authenticator code or a recovery code.",
11060
- "totpLabel": "TOTP / recovery code"
12570
+ "totpLabel": "TOTP / recovery code",
12571
+ "sessionStillOpen": "A live shell is still connected while you read this page.",
12572
+ "rootConfirmTitle": "Open a root shell?",
12573
+ "rootConfirmDesc": "This session is an unrestricted root PTY on the host. Commands are audited.",
12574
+ "rootConfirmBody": "Only continue if you intend to run privileged host commands."
11061
12575
  },
11062
12576
  "uiInline": {
11063
12577
  "s27d9daa5": "runtime {{v0}} {{v1}},",
@@ -11287,6 +12801,7 @@
11287
12801
  "highRiskN": "{{count}} high-risk",
11288
12802
  "panelUpdate": "Panel update available",
11289
12803
  "riskOk": "Risk manageable",
12804
+ "riskUnevaluated": "Not evaluated — run Scan + OSV",
11290
12805
  "pendingScan": "Awaiting scan",
11291
12806
  "packages": "Packages",
11292
12807
  "highRisk": "High risk",
@@ -11297,6 +12812,7 @@
11297
12812
  "reload": "Reload",
11298
12813
  "osvTitle": "Query OSV for top 12 suggested packages (needs network)",
11299
12814
  "scanOsv": "Scan + OSV",
12815
+ "cveNotChecked": "Not checked",
11300
12816
  "scanPkgs": "Scan packages",
11301
12817
  "tabInventory": "Package inventory",
11302
12818
  "tabSelf": "Panel self",
@@ -11345,6 +12861,8 @@
11345
12861
  "policyTitle": "Update policy",
11346
12862
  "policyBody": "High-risk and CVE packages require approval before apply",
11347
12863
  "applyPkg": "Apply package upgrade",
12864
+ "rebootNeeded": "reboot",
12865
+ "kernelRebootHint": "Kernel packages need a reboot after apply",
11348
12866
  "applyPkgConfirm": "Upgrade {{name}}?",
11349
12867
  "applyPkgDesc": "Runs apt upgrade for this package on the host. Needs root + YSK_EXECUTE.",
11350
12868
  "lastScan": "Last scan",
@@ -11355,11 +12873,12 @@
11355
12873
  "selfCurrentShort": "Current",
11356
12874
  "selfLatestShort": "Latest",
11357
12875
  "applyPanelUpdate": "Apply panel update",
12876
+ "applyPanelAlreadyLatest": "Already the latest panel version",
11358
12877
  "recheck": "Recheck",
11359
12878
  "aboutScope": "Scope",
11360
- "aboutScopeV": "ysk-server control-plane version · not full-system apt upgrade",
12879
+ "aboutScopeV": "ysk-server panel + catalog services + runtimes + remaining apt packages",
11361
12880
  "aboutChannel": "Channel",
11362
- "aboutChannelV": "npm → GitHub release → package.json; apply via npm install -g or git (YSK_SOURCE_ROOT)",
12881
+ "aboutChannelV": "npm package ysk-server → GitHub release → apps/server/package.json; apply: npm i -g ysk-server@version or git (YSK_SOURCE_ROOT)",
11363
12882
  "aboutFail": "Failures",
11364
12883
  "aboutFailV": "Unavailable channels are not reported as up-to-date; apply needs EXECUTE; git apply needs service restart",
11365
12884
  "jobsTitle": "Scheduled jobs",
@@ -11370,7 +12889,52 @@
11370
12889
  "scanPolicy": "Scan",
11371
12890
  "scanPolicyV": "Scan ≠ upgraded; apply changes the system",
11372
12891
  "highRiskPolicy": "High risk",
11373
- "highRiskPolicyV": "Needs approval: second confirm before send",
12892
+ "highRiskPolicyV": "Needs approval: the Apply button opens a confirm dialog before anything is sent",
12893
+ "needApprovalHint": "Open Available and filter to packages that need approval",
12894
+ "applyNeedConfirm": "Opens a confirm dialog before applying",
12895
+ "probeFailed": "Probe failed",
12896
+ "notViaApt": "Not managed by apt — no candidate",
12897
+ "noCandidate": "No candidate from package manager",
12898
+ "cveLabel": "CVE",
12899
+ "jobOpenGeo": "GeoIP page",
12900
+ "job": {
12901
+ "protection_probe": {
12902
+ "name": "Protection probe",
12903
+ "hint": "Periodic defense signals"
12904
+ },
12905
+ "updates_scan": {
12906
+ "name": "Updates scan",
12907
+ "hint": "Refresh package inventory"
12908
+ },
12909
+ "daily_backup": {
12910
+ "name": "Daily backup",
12911
+ "hint": "Scheduled backup all"
12912
+ },
12913
+ "db_temp_expire": {
12914
+ "name": "Expire temp DB users",
12915
+ "hint": "Drop expired temporary database users"
12916
+ },
12917
+ "defense_auto_ban": {
12918
+ "name": "Defense auto-ban",
12919
+ "hint": "Apply auto-ban tick"
12920
+ },
12921
+ "defense_geoip_update": {
12922
+ "name": "GeoIP update",
12923
+ "hint": "Download GeoIP databases"
12924
+ },
12925
+ "log_auto_vacuum": {
12926
+ "name": "Log vacuum",
12927
+ "hint": "journald retention"
12928
+ },
12929
+ "email_dnsbl": {
12930
+ "name": "Email DNSBL",
12931
+ "hint": "Mail DNSBL check"
12932
+ },
12933
+ "validators_upgrade_scan": {
12934
+ "name": "Validators upgrade scan",
12935
+ "hint": "Check validator image / binary updates"
12936
+ }
12937
+ },
11374
12938
  "permPolicy": "Permissions",
11375
12939
  "permPolicyV": "Without EXECUTE/root → blocked (no fake success)",
11376
12940
  "osvPolicyV": "Needs network; enriches top 12 suggestions only",
@@ -11395,6 +12959,9 @@
11395
12959
  "updateFailed": "Update failed",
11396
12960
  "updateIncomplete": "Update incomplete",
11397
12961
  "appliedUpdate": "Update applied",
12962
+ "panelRestarting": "Panel is restarting to load the new version…",
12963
+ "panelRestarted": "Panel is back · {{version}}",
12964
+ "panelRestartWait": "Panel apply finished. If this page does not refresh, reload after a few seconds.",
11398
12965
  "aptCandidate": "apt Candidate",
11399
12966
  "advice": {
11400
12967
  "update": "Update recommended",
@@ -11436,7 +13003,26 @@
11436
13003
  "scanNow": "Scan now",
11437
13004
  "viewUpgradable": "View upgradable",
11438
13005
  "installElsewhere": "To install packages (Nginx, PHP, databases…), open the matching feature page — not this hub.",
11439
- "status": "Status"
13006
+ "status": "Status",
13007
+ "groupService": "Services",
13008
+ "groupRuntime": "Runtimes",
13009
+ "groupOs": "System packages",
13010
+ "notInstalled": "Not installed",
13011
+ "goToPage": "Open page",
13012
+ "hubHint": "Catalog software and runtimes on this host. Scan to refresh.",
13013
+ "intervalDay": "every day",
13014
+ "intervalDays": "every {{n}} days",
13015
+ "intervalHour": "every hour",
13016
+ "intervalHours": "every {{n}} hours",
13017
+ "intervalMinutes": "every {{n}} minutes",
13018
+ "intervalSeconds": "every {{n}} seconds",
13019
+ "availableHint": "Packages with a newer candidate from the package manager.",
13020
+ "servicesHint": "Catalog services on this host. Open the service page to install.",
13021
+ "runtimeHint": "Runtimes on this host. Version upgrades are done on each runtime page.",
13022
+ "needsReboot": "Reboot needed",
13023
+ "kernelRebootWarn": "Installing a new kernel usually needs a reboot before it is used.",
13024
+ "neverRun": "not run yet",
13025
+ "scanOsvN": "Scan + OSV (first {{n}})"
11440
13026
  },
11441
13027
  "users": {
11442
13028
  "userCount": "{{count}} users",
@@ -11444,12 +13030,17 @@
11444
13030
  "packages": "Packages",
11445
13031
  "suspended": "Suspended",
11446
13032
  "securityCenter": "Security center",
13033
+ "singleAdminNo2fa": "This host has a single admin and 2FA is off. Enable admin 2FA under Security, then add a backup admin on this page.",
13034
+ "enableAdmin2fa": "Enable admin 2FA",
13035
+ "addBackupAdmin": "Add a backup admin",
11447
13036
  "loading": "Loading users & packages…",
11448
13037
  "userList": "Users ({{count}})",
11449
13038
  "userListDesc": "Open detail to edit role, password, package, overrides",
11450
13039
  "createUser": "Create user",
13040
+ "operatorHighRiskHint": "The factory operator role includes high-risk writes (services, firewall, package apply, MySQL, Nginx publish). Narrow it only if you intend to change every existing operator.",
11451
13041
  "createUserPlus": "+ Create user",
11452
13042
  "searchPh": "Username / role / package",
13043
+ "searchPkgPh": "Package name",
11453
13044
  "searchUsersAria": "Search users",
11454
13045
  "user": "User",
11455
13046
  "roles": "Roles",
@@ -11459,6 +13050,9 @@
11459
13050
  "resume": "Resume",
11460
13051
  "suspend": "Suspend",
11461
13052
  "impersonate": "Impersonate",
13053
+ "impersonateHint": "Opens a session as this user. Use the account menu to leave impersonation.",
13054
+ "cannotDeleteSelf": "You cannot delete the signed-in account",
13055
+ "cannotImpersonateSelf": "You are already signed in as this account",
11462
13056
  "openDetail": "Details",
11463
13057
  "edit": "Edit",
11464
13058
  "resetPassword": "Reset password",
@@ -11558,7 +13152,283 @@
11558
13152
  "securityClearTotpHint": "Requires step-up",
11559
13153
  "securityClearConfirm": "Type the username to confirm clearing 2FA",
11560
13154
  "securityClearOk": "Cleared 2FA for {{name}}",
11561
- "securitySelfNote": "To set up your own 2FA, open Security → My security."
13155
+ "securitySelfNote": "To set up your own 2FA, open Security → My security.",
13156
+ "cannotModifySelf": "You cannot suspend or demote the signed-in account",
13157
+ "cannotDeleteLastAdmin": "Cannot delete the last admin",
13158
+ "cannotDemoteLastAdmin": "Cannot suspend or demote the last admin",
13159
+ "lockSelfHint": "This is the signed-in account. Delete, suspend, and role change are blocked to prevent lock-out.",
13160
+ "lockLastAdminHint": "This is the last admin. Delete, suspend, and demotion are blocked.",
13161
+ "demoteAdminTitle": "Demote this admin?",
13162
+ "demoteAdminDesc": "This user will lose full admin access. Confirm only if another admin remains.",
13163
+ "quotaNonNeg": "Counts and quotas cannot be negative.",
13164
+ "diskQuotaHint": "Presets are GiB; custom box is MiB.",
13165
+ "bandwidthHint": "0 means unlimited."
13166
+ },
13167
+ "validators": {
13168
+ "title": "Validators (Beta)",
13169
+ "subtitle": "Install and manage L1 nodes on this host. Non-custodial — you keep the keys.",
13170
+ "beta": "Beta",
13171
+ "tab": {
13172
+ "nodes": "Nodes",
13173
+ "disk": "Disk",
13174
+ "about": "About"
13175
+ },
13176
+ "empty": {
13177
+ "title": "No validator nodes yet",
13178
+ "desc": "Create a testnet node in a few clicks."
13179
+ },
13180
+ "refresh": "Refresh",
13181
+ "disk": {
13182
+ "title": "Validator disk",
13183
+ "root": "Data directory",
13184
+ "free": "Free",
13185
+ "used": "Used",
13186
+ "none": "No instance data yet",
13187
+ "warn": "Disk usage is high (70%+)",
13188
+ "danger": "Disk usage is critical (85%+)",
13189
+ "autoClear": "Auto-clear the largest stopped instance when disk is critical (off by default)",
13190
+ "autoClearRisk": "Destructive: the largest stopped instance is deleted without a further prompt. Default is off. Check audit / logs after it fires.",
13191
+ "autoClearConfirmTitle": "Enable auto-clear?",
13192
+ "autoClearC1": "When disk is critical, the largest stopped instance is deleted without asking again."
13193
+ },
13194
+ "chain": {
13195
+ "eth": "Ethereum",
13196
+ "avax": "Avalanche",
13197
+ "near": "NEAR",
13198
+ "ada": "Cardano",
13199
+ "btc": "Bitcoin",
13200
+ "cosmos": "Cosmos Hub",
13201
+ "sui": "Sui",
13202
+ "aptos": "Aptos",
13203
+ "dot": "Polkadot",
13204
+ "sol": "Solana"
13205
+ },
13206
+ "network": {
13207
+ "hoodi": "Hoodi",
13208
+ "sepolia": "Sepolia",
13209
+ "mainnet": "Mainnet",
13210
+ "fuji": "Fuji",
13211
+ "testnet": "Testnet",
13212
+ "preview": "Preview",
13213
+ "preprod": "Preprod",
13214
+ "westend": "Westend"
13215
+ },
13216
+ "networkKind": {
13217
+ "testnet": "Testnet",
13218
+ "mainnet": "Mainnet",
13219
+ "mixed": "Mainnet + testnet"
13220
+ },
13221
+ "profile": {
13222
+ "minimal": "Minimal",
13223
+ "pruned": "Pruned",
13224
+ "validator-ready": "Validator-ready",
13225
+ "rpc": "RPC"
13226
+ },
13227
+ "col": {
13228
+ "id": "ID",
13229
+ "chain": "Chain",
13230
+ "network": "Network",
13231
+ "profile": "Profile",
13232
+ "status": "Status",
13233
+ "disk": "Disk"
13234
+ },
13235
+ "cli": {
13236
+ "usage": "Usage: ysk-server validators list|chains|disk|get|status|logs|create|start|stop|restart|clear|upgrade|policy|mithril|prune|switch-network|snapshot|compose|settings [--chain C] [--network N] [--profile P] [--el EL] [--cl CL] [--data-path P] [--rpc-port N] [--id ID] [--upgrade POLICY] [--confirm TOKEN] [--execute] [--json]"
13237
+ },
13238
+ "clients": {
13239
+ "el": "Execution client",
13240
+ "cl": "Consensus client"
13241
+ },
13242
+ "mithril": {
13243
+ "label": "Restore from Mithril snapshot first (recommended on testnet)",
13244
+ "action": "Restore with Mithril"
13245
+ },
13246
+ "errors": {
13247
+ "notFound": "Validator instance not found",
13248
+ "invalidId": "Invalid instance id",
13249
+ "diskLow": "Not enough free disk for this chain, network, and profile",
13250
+ "diskUnknownMainnet": "Cannot measure free disk; refusing mainnet create",
13251
+ "needDocker": "Docker Compose is required and was not found",
13252
+ "composeFailed": "docker compose failed",
13253
+ "needConfirm": "Clear requires confirm=instance id or CLEAR",
13254
+ "mithrilAdaOnly": "Mithril restore is only available for Cardano",
13255
+ "needMithrilConfirm": "Mithril requires confirm=instance id or MITHRIL",
13256
+ "mithrilBlocked": "Mithril docker run was blocked by the allowlist",
13257
+ "mithrilKey": "Could not load the Mithril genesis verification key",
13258
+ "mithrilFailed": "Mithril snapshot download failed",
13259
+ "pruneFailed": "Prune failed",
13260
+ "switchNeedStop": "Stop the node before switching network",
13261
+ "switchNeedClear": "Switching network clears chain data. Confirm with instance id or CLEAR",
13262
+ "composeMissing": "Compose file not found",
13263
+ "composeNotManaged": "Refusing to write a compose file that is not YSK-managed",
13264
+ "badDataPath": "Data path must be an absolute directory outside system paths",
13265
+ "portInUse": "That RPC port is already used by another validator instance",
13266
+ "snapshotUnsupported": "No allowlisted snapshot source for this chain",
13267
+ "snapshotLookup": "Could not resolve the official snapshot pointer",
13268
+ "needSnapshotConfirm": "Snapshot restore requires confirm=instance id or SNAPSHOT",
13269
+ "snapshotBlocked": "Snapshot docker run was blocked by the allowlist",
13270
+ "snapshotFailed": "Snapshot download or extract failed"
13271
+ },
13272
+ "notes": {
13273
+ "beta": "This feature is Beta. Host changes need root and YSK_EXECUTE=1.",
13274
+ "noKeys": "YSK Server never generates or stores staking keys.",
13275
+ "dockerSoon": "Install and start from this page wizard. Host changes need root and YSK_EXECUTE=1.",
13276
+ "dryCreate": "Wrote instance spec and compose (dry-run). Pass --execute and YSK_EXECUTE=1 to start containers.",
13277
+ "dryStart": "Start is dry-run. Pass --execute and YSK_EXECUTE=1.",
13278
+ "dryStop": "Stop is dry-run. Pass --execute and YSK_EXECUTE=1.",
13279
+ "dryClear": "Clear is dry-run. Pass --execute and YSK_EXECUTE=1.",
13280
+ "created": "Node created and compose started",
13281
+ "started": "Node started",
13282
+ "stopped": "Node stopped",
13283
+ "cleared": "Chain data cleared",
13284
+ "dryMithril": "Mithril restore is dry-run. Pass --execute and YSK_EXECUTE=1.",
13285
+ "mithril": "Mithril snapshot restored; node restarted",
13286
+ "dryPrune": "Prune is dry-run. Pass --execute and YSK_EXECUTE=1.",
13287
+ "pruned": "Unused project images pruned",
13288
+ "pruneProfile": "Client-native prune is the pruned/minimal profile. Recreate to change it.",
13289
+ "sameNetwork": "Already on that network",
13290
+ "drySwitch": "Network switch is dry-run.",
13291
+ "switched": "Network switched and chain data cleared",
13292
+ "dryCompose": "Would write compose.yml",
13293
+ "composeWrote": "Wrote compose.yml",
13294
+ "statsEmpty": "No running containers to measure",
13295
+ "autoClearNone": "No stopped instance to auto-clear",
13296
+ "drySnapshot": "Snapshot restore is dry-run. Pass --execute and YSK_EXECUTE=1.",
13297
+ "snapshotEthEl": "Restored ethPandaOps EL archive and reset CL for checkpoint sync",
13298
+ "snapshotEthCl": "Reset CL data for official checkpoint sync",
13299
+ "snapshotNear": "Wiped NEAR data; compose will re-init official genesis and epoch sync",
13300
+ "nativePrune": "Ran the client-native prune command",
13301
+ "dryDelete": "Delete is dry-run. Pass --execute and YSK_EXECUTE=1.",
13302
+ "deleted": "Node deleted"
13303
+ },
13304
+ "create": "Create node",
13305
+ "wizard": {
13306
+ "title": "Create node",
13307
+ "stepOf": "Step {{n}} / {{total}}",
13308
+ "stepChain": "Chain",
13309
+ "stepNetwork": "Network",
13310
+ "stepProfile": "Profile",
13311
+ "stepSummary": "Summary",
13312
+ "needDocker": "Docker Engine is not installed. Install it first — this button stays disabled.",
13313
+ "diskNeed": "This profile needs about {{need}} · free {{free}}",
13314
+ "diskShort": "Not enough free disk for this chain / network / profile",
13315
+ "back": "Back",
13316
+ "next": "Next",
13317
+ "install": "Install",
13318
+ "mainnetWarn": "Mainnet needs a lot of free disk (ETH often 800 GiB+). Testnet is recommended.",
13319
+ "mainnetAck": "I understand the disk and slashing risk. Continue with mainnet.",
13320
+ "heavyWarn": "This chain is heavy (large disk and high IOPS). Mainnet Solana typically needs 2 TiB+.",
13321
+ "memory": "Memory limit",
13322
+ "cpus": "CPU limit",
13323
+ "dataPath": "Data path",
13324
+ "rpcPort": "RPC port",
13325
+ "limitNone": "No limit",
13326
+ "rpcDefault": "Default",
13327
+ "customPath": "Use a custom data path",
13328
+ "installConfirmTitle": "Install this node?",
13329
+ "installConfirmDesc": "{{chain}} · {{network}} · {{profile}}. About {{disk}} of disk. The image pull can take a long time.",
13330
+ "installC1": "Several gigabytes of images may be downloaded.",
13331
+ "installC2": "You can cancel the panel task; already-pulled images are not deleted automatically."
13332
+ },
13333
+ "actions": {
13334
+ "detail": "Details",
13335
+ "start": "Start",
13336
+ "stop": "Stop",
13337
+ "restart": "Restart",
13338
+ "clear": "Clear",
13339
+ "upgrade": "Upgrade",
13340
+ "clearConfirm": "Type instance id or CLEAR",
13341
+ "prune": "Prune",
13342
+ "switchNetwork": "Switch network",
13343
+ "removeUnit": "Also remove compose / instance record",
13344
+ "restoreAfter": "Restore snapshot after clear",
13345
+ "delete": "Delete",
13346
+ "deleteTitle": "Delete {{id}}",
13347
+ "deleteDesc": "This removes the node from the panel.",
13348
+ "deleteC1": "Docker Compose is stopped and removed",
13349
+ "deleteC2": "Chain data on disk is deleted",
13350
+ "deleteC3": "The instance record is removed",
13351
+ "pruneTitle": "Prune unused images",
13352
+ "pruneDesc": "Type the instance id to prune unused Compose images for this node.",
13353
+ "pruneC1": "Unused images labelled for this Compose project are deleted.",
13354
+ "clearTitle": "Clear {{id}}",
13355
+ "clearC1": "Chain data on disk is deleted.",
13356
+ "clearC2": "The instance stays in the panel, stopped and empty.",
13357
+ "switchTitle": "Switch network",
13358
+ "switchC1": "The node is stopped and chain data is wiped before the new network is written."
13359
+ },
13360
+ "policy": {
13361
+ "label": "Upgrade policy",
13362
+ "manual": "Manual",
13363
+ "notify": "Notify",
13364
+ "auto-safe": "Auto (safe)",
13365
+ "auto-all": "Auto (all)"
13366
+ },
13367
+ "logs": {
13368
+ "empty": "No logs yet",
13369
+ "follow": "Follow logs"
13370
+ },
13371
+ "compose": {
13372
+ "label": "Compose file",
13373
+ "save": "Save compose"
13374
+ },
13375
+ "snapshot": {
13376
+ "action": "Restore snapshot",
13377
+ "mithril": "Cardano uses Mithril for certified snapshot restore.",
13378
+ "eth": "Ethereum mainnet uses official checkpoint sync on the consensus client. EL continues snap sync.",
13379
+ "ethEl": "Hoodi/Sepolia can restore an ethPandaOps EL archive, then checkpoint-sync the CL.",
13380
+ "avax": "Avalanche uses state-sync in the compose profile.",
13381
+ "near": "Official free NEAR tarball snapshots were retired. Restore wipes data and uses official genesis plus epoch sync.",
13382
+ "none": "No snapshot source is configured for this chain."
13383
+ },
13384
+ "stake": {
13385
+ "title": "Prepare for staking (you keep the keys)",
13386
+ "offlineKeys": "Generate keys offline. The panel never stores them.",
13387
+ "deposit": "Complete deposit / registration on the official launchpad.",
13388
+ "withdrawal": "Set withdrawal credentials yourself.",
13389
+ "monitor": "Watch disk, peers, and upgrade badges on this page."
13390
+ },
13391
+ "alerts": {
13392
+ "diskTitle": "Validator disk critical",
13393
+ "diskBody": "Free space on the validator data volume is critically low.",
13394
+ "upgradeTitle": "Validator upgrade available",
13395
+ "upgradeBody": "One or more node clients have a newer pinned version.",
13396
+ "syncTitle": "Validator node needs attention",
13397
+ "syncBody": "A node has been syncing for more than 6 hours or reported an error.",
13398
+ "rollbackTitle": "Validator upgrade rolled back",
13399
+ "rollbackBody": "Upgrade of {{id}} failed the health check and was rolled back."
13400
+ },
13401
+ "upgrade": {
13402
+ "changelog": "Changelog"
13403
+ },
13404
+ "readiness": {
13405
+ "dockerTitle": "Docker for validator nodes",
13406
+ "dockerOk": "{{count}} validator instance(s); Docker is installed",
13407
+ "dockerMissing": "Validator instances exist but the docker binary was not found"
13408
+ },
13409
+ "detail": {
13410
+ "status": "Status",
13411
+ "sync": "Sync",
13412
+ "peers": "Peers",
13413
+ "version": "Version",
13414
+ "access": "Access",
13415
+ "upgrade": "Updates",
13416
+ "upgradeHint": "How this node tracks client versions.",
13417
+ "network": "Network",
13418
+ "networkHint": "Switching network stops the node and clears chain data. Confirm under Clear data first.",
13419
+ "maintain": "Maintenance",
13420
+ "danger": "Clear data",
13421
+ "dangerHint": "Type the instance id or CLEAR. This deletes chain data on disk.",
13422
+ "compose": "Compose",
13423
+ "logs": "Logs"
13424
+ },
13425
+ "state": {
13426
+ "unknown": "Unknown",
13427
+ "stopped": "Stopped",
13428
+ "running": "Running",
13429
+ "syncing": "Syncing",
13430
+ "error": "Error"
13431
+ }
11562
13432
  },
11563
13433
  "vnc": {
11564
13434
  "pageDesc": "VNC server & client",
@@ -11681,15 +13551,19 @@
11681
13551
  },
11682
13552
  "installHint": "TigerVNC → noVNC; XFCE optional",
11683
13553
  "needTigerVnc": "TigerVNC required",
13554
+ "needXfceFirst": "Install XFCE first",
13555
+ "needSessionRunning": "Session is not running — start it first",
11684
13556
  "needNovnc": "noVNC required",
11685
13557
  "needXfce": "XFCE (optional)",
11686
13558
  "needViewer": "Viewer (optional)",
11687
13559
  "needViewerOrNovnc": "Viewer or noVNC",
11688
13560
  "settingsHint": "Defaults for new accounts",
13561
+ "settingsNeedStack": "These defaults apply when TigerVNC (and XFCE if selected) are installed. Install them on the Install tab first.",
13562
+ "clientNeedNovnc": "Open in browser needs noVNC. Install it on the Install tab before adding remotes you expect to open here.",
11689
13563
  "defaultDesktop": "Default desktop",
11690
13564
  "defaultGeometry": "Default resolution",
11691
13565
  "defaultDepth": "Colour depth",
11692
- "defaultRfbBind": "RFB listen",
13566
+ "defaultRfbBind": "VNC (RFB) listen range",
11693
13567
  "defaultAutostart": "Autostart sessions",
11694
13568
  "autostartLabel": "Start on boot",
11695
13569
  "settingsSaved": "VNC defaults saved",
@@ -11756,12 +13630,16 @@
11756
13630
  "nextPage": "Next",
11757
13631
  "pageOf": "Page {{page}} / {{total}} · {{count}}",
11758
13632
  "deleteAccountTitle": "Delete VNC account?",
11759
- "deleteAccountDesc": "Remove control-plane account {{name}} ({{user}}). Session will be stopped first.",
11760
- "deleteAccountC1": "VNC session for this display",
11761
- "deleteAccountC2": "Panel metadata under dataDir/vnc",
11762
- "deleteAccountC3User": "Linux user home will be removed (userdel -r)",
11763
- "deleteAccountC3Keep": "Linux user will be kept on the system",
13633
+ "deleteAccountDesc": "Remove control-plane account {{name}} (Linux user {{user}}). The VNC session for this display stops first.",
13634
+ "deleteAccountC1": "The VNC session for this account will be stopped first.",
13635
+ "deleteAccountC2": "The panel VNC account record will be removed.",
13636
+ "deleteAccountC3User": "The Linux user and home directory will also be removed. If the host refuses, the panel reports failure and the user stays.",
13637
+ "deleteAccountC3Keep": "The Linux user stays on the host; only the panel account is removed.",
11764
13638
  "removeLinuxUser": "Also remove Linux user and home directory",
13639
+ "deleteKeepUserWarn": "The Linux user will stay on the host as an orphan. You must clean it up later.",
13640
+ "bindRfbLine": "RFB {{bind}} :{{port}}",
13641
+ "bindNovncLine": "noVNC 127.0.0.1:{{port}}",
13642
+ "bindNovncHint": "noVNC listens on localhost. The desktop is reached through this panel, not the public internet, unless RFB bind is all interfaces.",
11765
13643
  "connection": "Connect",
11766
13644
  "connectionTitle": "Connection materials",
11767
13645
  "connectionDesc": "How clients reach {{name}}",
@@ -11804,7 +13682,8 @@
11804
13682
  "stackMissingShort": "Not installed",
11805
13683
  "editClientTitle": "Edit remote client",
11806
13684
  "editClientDesc": "Update path, hosts, and optional stored password.",
11807
- "clientUpdated": "Client profile updated"
13685
+ "clientUpdated": "Client profile updated",
13686
+ "rememberNeedPassword": "Enter a password first."
11808
13687
  },
11809
13688
  "vpn": {
11810
13689
  "pageDesc": "VPN server & client",
@@ -11869,6 +13748,11 @@
11869
13748
  "ensureServer": "Apply server",
11870
13749
  "openFirewall": "Open {{port}}/{{proto}}",
11871
13750
  "presets": "Port presets",
13751
+ "portHint": {
13752
+ "51820": "Default WireGuard listen port",
13753
+ "51821": "Alternate WireGuard listen port",
13754
+ "51822": "Second alternate WireGuard listen port"
13755
+ },
11872
13756
  "proto": "Protocol",
11873
13757
  "protoUdp": "UDP",
11874
13758
  "protoTcp": "TCP",
@@ -11878,8 +13762,16 @@
11878
13762
  "peersTitleOvpn": "Client configs",
11879
13763
  "peersTitleSs": "Access keys",
11880
13764
  "peerName": "Name",
11881
- "peerNamePlaceholder": "phone",
13765
+ "peerNamePlaceholder": "office-laptop",
11882
13766
  "addPeer": "+ Add",
13767
+ "installEngineFirst": "Install the VPN engine first",
13768
+ "needServerRunning": "{{engine}} is not running — apply the server first",
13769
+ "engineSummarySoftware": "{{installed}} installed · {{running}} running",
13770
+ "privateKeyOnce": "The client private key is shown only here. Download or copy it now — it cannot be recovered later.",
13771
+ "showPrivateKey": "Show private key",
13772
+ "hidePrivateKey": "Hide private key",
13773
+ "deletePeerTitle": "Delete peer {{name}}?",
13774
+ "deletePeerDesc": "Remove {{name}} ({{address}}). The client disconnects immediately and the config cannot be restored. The WireGuard server stays up.",
11883
13775
  "addPeerWg": "+ Add peer",
11884
13776
  "addPeerOvpn": "+ Add client",
11885
13777
  "addPeerSs": "+ Add key",
@@ -11935,6 +13827,8 @@
11935
13827
  "lanCidrs": "LAN networks",
11936
13828
  "customCidr": "CIDR",
11937
13829
  "addCidr": "Add"
11938
- }
13830
+ },
13831
+ "engineNotInstalled": "This VPN engine is not installed on the host.",
13832
+ "serverNotListening": "Server unit is not active. UDP/TCP {{port}} may be closed."
11939
13833
  }
11940
13834
  }