+ )}
+
{!isAgent && (
record.transitive ? (
{isUpdateEligible(record) && (
-
+
}
- aria-label={t('pages.nodes.updatePanel')}
+ aria-label={t(
+ record.nodeType === 'agent'
+ ? 'pages.nodes.updateAgent'
+ : 'pages.nodes.updatePanel',
+ )}
onClick={() => onUpdateNode(record)}
/>
@@ -303,7 +313,7 @@ export default function NodeList({
title: t('pages.nodes.enable'),
dataIndex: 'enable',
align: 'center',
- width: 80,
+ width: 64,
render: (_value, record) =>
record.transitive ? (
—
@@ -362,17 +372,20 @@ export default function NodeList({
),
dataIndex: 'url',
+ width: 330,
ellipsis: true,
render: (_value, record) => {
if (record.nodeType === 'agent') {
// Agent nodes have no panel to link to: show the host IPs the
- // agent reports with its heartbeat as plain text (P13).
+ // agent reports with its heartbeat as plain text on one line
+ // (P13, layout per item 21).
const ips = [record.ipv4, record.ipv6].filter(Boolean) as string[];
return (
{ips.length > 0
- ? ips.map((ip) => (
-
+ ? ips.map((ip, i) => (
+
+ {i > 0 && · }
{ip}
))
@@ -436,10 +449,11 @@ export default function NodeList({
dataIndex: 'panelVersion',
align: 'center',
render: (_value, record) => {
- // Agent rows carry an "agent " label, not an upstream
- // panel version: the update badge must never light up for them
- // (the version comparator falls back to string inequality for
- // unparseable versions, which would always differ) (P13).
+ // Agent rows carry the A-series display version ("A1.0.0"), not
+ // an upstream panel version: the update badge must never light
+ // up for them (the version comparator falls back to string
+ // inequality for unparseable versions, which would always
+ // differ) (P13, item 18).
const canUpdate =
record.nodeType !== 'agent' &&
isUpdateEligible(record) &&
@@ -474,7 +488,7 @@ export default function NodeList({
{
title: t('clients'),
align: 'center',
- width: 180,
+ width: 150,
render: (_value, record) => (
@@ -527,7 +541,7 @@ export default function NodeList({
title: t('pages.nodes.latency'),
dataIndex: 'latencyMs',
align: 'center',
- width: 100,
+ width: 84,
render: (_value, record) =>
record.latencyMs && record.latencyMs > 0 ? `${record.latencyMs} ms` : '-',
},
@@ -535,7 +549,7 @@ export default function NodeList({
title: t('pages.nodes.lastHeartbeat'),
dataIndex: 'lastHeartbeat',
align: 'center',
- width: 120,
+ width: 96,
render: (_value, record) => relativeTime(record.lastHeartbeat),
},
],
@@ -652,7 +666,12 @@ export default function NodeList({
key: 'update',
label: (
<>
- {t('pages.nodes.updatePanel')}
+ {' '}
+ {t(
+ record.nodeType === 'agent'
+ ? 'pages.nodes.updateAgent'
+ : 'pages.nodes.updatePanel',
+ )}
>
),
onClick: () => onUpdateNode(record),
diff --git a/frontend/src/pages/nodes/NodesPage.tsx b/frontend/src/pages/nodes/NodesPage.tsx
index 5dc8579..4df0be9 100644
--- a/frontend/src/pages/nodes/NodesPage.tsx
+++ b/frontend/src/pages/nodes/NodesPage.tsx
@@ -232,6 +232,18 @@ export default function NodesPage() {
const onUpdateNode = useCallback(
(node: NodeRecord) => {
+ // Agent nodes update through the master-recorded intent (item 20):
+ // there is no channel to pick, so the confirm is a plain message.
+ if (node.nodeType === 'agent') {
+ modal.confirm({
+ title: t('pages.nodes.updateConfirmTitle', { count: 1 }),
+ content: t('pages.nodes.updateAgentConfirmContent'),
+ okText: t('update'),
+ cancelText: t('cancel'),
+ onOk: () => runUpdate([node.id], false),
+ });
+ return;
+ }
devRef.current = false;
modal.confirm({
title: t('pages.nodes.updateConfirmTitle', { count: 1 }),
diff --git a/frontend/src/schemas/node.ts b/frontend/src/schemas/node.ts
index c3ce052..76954cd 100644
--- a/frontend/src/schemas/node.ts
+++ b/frontend/src/schemas/node.ts
@@ -51,6 +51,10 @@ export const NodeRecordSchema = z
// Rendered as plain text in the address column for agent rows.
ipv4: z.string().optional(),
ipv6: z.string().optional(),
+ // Item 20: last one-click agent update outcome, agent rows only.
+ agentUpdateState: z.string().optional(),
+ agentUpdateError: z.string().optional(),
+ agentUpdateTarget: z.string().optional(),
})
.loose();
diff --git a/frontend/src/test/panel-version.test.ts b/frontend/src/test/panel-version.test.ts
index 5f62896..8c2fe32 100644
--- a/frontend/src/test/panel-version.test.ts
+++ b/frontend/src/test/panel-version.test.ts
@@ -40,7 +40,9 @@ describe('formatPanelVersion', () => {
it('does not double up the v on already-prefixed tags', () => {
expect(formatPanelVersion('v3.4.0')).toBe('v3.4.0');
- expect(formatPanelVersion('V3.4.0')).toBe('v3.4.0');
+ // An uppercase-V three-part version is this fork's master display
+ // form and stays verbatim (see the V/A case below).
+ expect(formatPanelVersion('V3.4.0')).toBe('V3.4.0');
});
it('shows dev builds verbatim without a v prefix', () => {
@@ -53,4 +55,10 @@ describe('formatPanelVersion', () => {
expect(formatPanelVersion(undefined)).toBe('');
expect(formatPanelVersion('?')).toBe('?');
});
+
+ it('shows this fork’s V/A display versions verbatim', () => {
+ expect(formatPanelVersion('V1.0.0')).toBe('V1.0.0');
+ expect(formatPanelVersion('A1.0.0')).toBe('A1.0.0');
+ expect(formatPanelVersion('A1.0.9')).toBe('A1.0.9');
+ });
});
diff --git a/internal/web/translation/ar-EG.json b/internal/web/translation/ar-EG.json
index 08210c5..77443d1 100644
--- a/internal/web/translation/ar-EG.json
+++ b/internal/web/translation/ar-EG.json
@@ -128,7 +128,7 @@
"storage": "تخزين",
"memory": "الذاكرة",
"updatePanel": "تحديث البانل",
- "panelUpdateDesc": "ده هيحدث 3X-UI لآخر إصدار وهيعيد تشغيل خدمة البانل.",
+ "panelUpdateDesc": "ده هيحدث L-UI لآخر إصدار وهيعيد تشغيل خدمة البانل.",
"currentPanelVersion": "إصدار البانل الحالي",
"latestPanelVersion": "أحدث إصدار للبانل",
"panelUpToDate": "البانل محدث لآخر إصدار",
@@ -146,7 +146,7 @@
"sent": "مرسل",
"received": "مستقبل",
"panelUpdateDialog": "هل فعلاً عايز تحدث البانل؟",
- "panelUpdateDialogDesc": "ده هيحدث 3X-UI للإصدار #version# وهيعيد تشغيل البانل.",
+ "panelUpdateDialogDesc": "ده هيحدث L-UI للإصدار #version# وهيعيد تشغيل البانل.",
"panelUpdateStartedPopover": "بدأ تحديث البانل",
"panelUpdateFailedTitle": "فشل تحديث البانل",
"panelUpdateFailedDesc": "لم يكتمل التحديث بنجاح. تحقق من سجلات الخادم، أو نفّذ الأمر «x-ui update» من سطر الأوامر.",
@@ -850,6 +850,10 @@
"updateAvailable": "تحديث متاح",
"updateConfirmTitle": "تحديث {count} عقدة إلى أحدث إصدار؟",
"updateConfirmContent": "كل عقدة محددة ستنزّل أحدث إصدار وتعيد التشغيل عليه. يتم تحديث العقد المفعّلة والمتصلة فقط.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "التحديث إلى قناة التطوير (أحدث كومِت)",
"testConnection": "اختبار الاتصال",
"connectionOk": "الاتصال شغال ({ms} ms)",
@@ -1747,7 +1751,7 @@
"report": "🕰 التقارير المجدولة: {{ .RunTime }}\r\n",
"datetime": "⏰ التاريخ والوقت: {{ .DateTime }}\r\n",
"hostname": "💻 المضيف: {{ .Hostname }}\r\n",
- "version": "🚀 نسخة 3X-UI: {{ .Version }}\r\n",
+ "version": "🚀 نسخة L-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 نسخة Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
diff --git a/internal/web/translation/en-US.json b/internal/web/translation/en-US.json
index 4256661..a23cdfc 100644
--- a/internal/web/translation/en-US.json
+++ b/internal/web/translation/en-US.json
@@ -128,7 +128,7 @@
"storage": "Storage",
"memory": "RAM",
"updatePanel": "Update Panel",
- "panelUpdateDesc": "This will update 3X-UI itself to the latest release and restart the panel service.",
+ "panelUpdateDesc": "This will update L-UI itself to the latest release and restart the panel service.",
"currentPanelVersion": "Current panel version",
"latestPanelVersion": "Latest panel version",
"panelUpToDate": "Panel is up to date",
@@ -146,7 +146,7 @@
"sent": "Sent",
"received": "Received",
"panelUpdateDialog": "Do you really want to update the panel?",
- "panelUpdateDialogDesc": "This will update 3X-UI to #version# and restart the panel service.",
+ "panelUpdateDialogDesc": "This will update L-UI to #version# and restart the panel service.",
"panelUpdateStartedPopover": "Panel update started",
"panelUpdateFailedTitle": "Panel update failed",
"panelUpdateFailedDesc": "The update did not finish successfully. Check the server logs, or run 'x-ui update' from the command line.",
@@ -990,6 +990,10 @@
"updateAvailable": "Update available",
"updateConfirmTitle": "Update {count} node(s) to the latest version?",
"updateConfirmContent": "Each selected node downloads the latest release and restarts onto it. Only enabled, online nodes are updated.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Update to Dev channel (latest commit)",
"testConnection": "Test Connection",
"connectionOk": "Connection OK ({ms} ms)",
@@ -1769,7 +1773,7 @@
"report": "🕰 Scheduled Reports: {{ .RunTime }}\r\n",
"datetime": "⏰ Date&Time: {{ .DateTime }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
- "version": "🚀 3X-UI Version: {{ .Version }}\r\n",
+ "version": "🚀 L-UI Version: {{ .Version }}\r\n",
"xrayVersion": "📡 Xray Version: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
diff --git a/internal/web/translation/es-ES.json b/internal/web/translation/es-ES.json
index 0a349d9..114024f 100644
--- a/internal/web/translation/es-ES.json
+++ b/internal/web/translation/es-ES.json
@@ -128,7 +128,7 @@
"storage": "Almacenamiento",
"memory": "Memoria",
"updatePanel": "Actualizar panel",
- "panelUpdateDesc": "Esto actualizará 3X-UI a la última versión y reiniciará el servicio del panel.",
+ "panelUpdateDesc": "Esto actualizará L-UI a la última versión y reiniciará el servicio del panel.",
"currentPanelVersion": "Versión actual del panel",
"latestPanelVersion": "Última versión del panel",
"panelUpToDate": "El panel está actualizado",
@@ -146,7 +146,7 @@
"sent": "Enviado",
"received": "Recibido",
"panelUpdateDialog": "¿Deseas actualizar el panel?",
- "panelUpdateDialogDesc": "Esto actualizará 3X-UI a la versión #version# y reiniciará el servicio del panel.",
+ "panelUpdateDialogDesc": "Esto actualizará L-UI a la versión #version# y reiniciará el servicio del panel.",
"panelUpdateStartedPopover": "Actualización del panel iniciada",
"panelUpdateFailedTitle": "Error al actualizar el panel",
"panelUpdateFailedDesc": "La actualización no se completó correctamente. Revisa los registros del servidor o ejecuta 'x-ui update' desde la línea de comandos.",
@@ -850,6 +850,10 @@
"updateAvailable": "Actualización disponible",
"updateConfirmTitle": "¿Actualizar {count} nodo(s) a la última versión?",
"updateConfirmContent": "Cada nodo seleccionado descarga la última versión y se reinicia con ella. Solo se actualizan los nodos habilitados y en línea.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Actualizar al canal de desarrollo (último commit)",
"testConnection": "Probar conexión",
"connectionOk": "Conexión correcta ({ms} ms)",
diff --git a/internal/web/translation/fa-IR.json b/internal/web/translation/fa-IR.json
index 1e48127..86e0c00 100644
--- a/internal/web/translation/fa-IR.json
+++ b/internal/web/translation/fa-IR.json
@@ -128,7 +128,7 @@
"storage": "ذخیرهسازی",
"memory": "حافظه",
"updatePanel": "بهروزرسانی پنل",
- "panelUpdateDesc": "این عملیات 3X-UI را به آخرین نسخه بهروزرسانی میکند و سرویس پنل را مجدداً راهاندازی میکند.",
+ "panelUpdateDesc": "این عملیات L-UI را به آخرین نسخه بهروزرسانی میکند و سرویس پنل را مجدداً راهاندازی میکند.",
"currentPanelVersion": "نسخه فعلی پنل",
"latestPanelVersion": "آخرین نسخه پنل",
"panelUpToDate": "پنل بهروز است",
@@ -146,7 +146,7 @@
"sent": "ارسال شده",
"received": "دریافت شده",
"panelUpdateDialog": "آیا مطمئن هستید که میخواهید پنل را بهروزرسانی کنید؟",
- "panelUpdateDialogDesc": "این 3X-UI را به نسخه #version# بهروزرسانی کرده و سرویس پنل را مجدداً راهاندازی میکند.",
+ "panelUpdateDialogDesc": "این L-UI را به نسخه #version# بهروزرسانی کرده و سرویس پنل را مجدداً راهاندازی میکند.",
"panelUpdateStartedPopover": "بهروزرسانی پنل آغاز شد",
"panelUpdateFailedTitle": "بهروزرسانی پنل ناموفق بود",
"panelUpdateFailedDesc": "بهروزرسانی با موفقیت به پایان نرسید. گزارشهای سرور را بررسی کنید یا دستور «x-ui update» را از خط فرمان اجرا کنید.",
@@ -850,6 +850,10 @@
"updateAvailable": "بهروزرسانی موجود",
"updateConfirmTitle": "{count} نود به آخرین نسخه بهروزرسانی شوند؟",
"updateConfirmContent": "هر نود انتخابشده آخرین نسخه را دانلود و روی آن ریاستارت میشود. فقط نودهای فعال و آنلاین بهروزرسانی میشوند.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "بهروزرسانی به کانال دِو (آخرین کامیت)",
"testConnection": "تست اتصال",
"connectionOk": "اتصال موفق ({ms} میلیثانیه)",
diff --git a/internal/web/translation/id-ID.json b/internal/web/translation/id-ID.json
index 860327a..8f78b7f 100644
--- a/internal/web/translation/id-ID.json
+++ b/internal/web/translation/id-ID.json
@@ -128,7 +128,7 @@
"storage": "Penyimpanan",
"memory": "Memori",
"updatePanel": "Perbarui Panel",
- "panelUpdateDesc": "Ini akan memperbarui 3X-UI ke rilis terbaru dan me-restart layanan panel.",
+ "panelUpdateDesc": "Ini akan memperbarui L-UI ke rilis terbaru dan me-restart layanan panel.",
"currentPanelVersion": "Versi panel saat ini",
"latestPanelVersion": "Versi panel terbaru",
"panelUpToDate": "Panel sudah terbaru",
@@ -146,7 +146,7 @@
"sent": "Dikirim",
"received": "Diterima",
"panelUpdateDialog": "Apakah Anda benar-benar ingin memperbarui panel?",
- "panelUpdateDialogDesc": "Ini akan memperbarui 3X-UI ke #version# dan me-restart layanan panel.",
+ "panelUpdateDialogDesc": "Ini akan memperbarui L-UI ke #version# dan me-restart layanan panel.",
"panelUpdateStartedPopover": "Pembaruan panel dimulai",
"panelUpdateFailedTitle": "Pembaruan panel gagal",
"panelUpdateFailedDesc": "Pembaruan tidak selesai dengan sukses. Periksa log server, atau jalankan 'x-ui update' dari baris perintah.",
@@ -850,6 +850,10 @@
"updateAvailable": "Pembaruan tersedia",
"updateConfirmTitle": "Perbarui {count} node ke versi terbaru?",
"updateConfirmContent": "Setiap node terpilih mengunduh rilis terbaru dan memulai ulang. Hanya node aktif dan online yang diperbarui.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Perbarui ke kanal dev (commit terbaru)",
"testConnection": "Tes Koneksi",
"connectionOk": "Koneksi OK ({ms} ms)",
@@ -1747,7 +1751,7 @@
"report": "🕰 Laporan Terjadwal: {{ .RunTime }}\r\n",
"datetime": "⏰ Tanggal & Waktu: {{ .DateTime }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
- "version": "🚀 Versi 3X-UI: {{ .Version }}\r\n",
+ "version": "🚀 Versi L-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 Versi Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
diff --git a/internal/web/translation/ja-JP.json b/internal/web/translation/ja-JP.json
index 073136a..785d165 100644
--- a/internal/web/translation/ja-JP.json
+++ b/internal/web/translation/ja-JP.json
@@ -128,7 +128,7 @@
"storage": "ストレージ",
"memory": "メモリ",
"updatePanel": "パネルを更新",
- "panelUpdateDesc": "これにより3X-UIが最新リリースに更新され、パネルサービスが再起動されます。",
+ "panelUpdateDesc": "これによりL-UIが最新リリースに更新され、パネルサービスが再起動されます。",
"currentPanelVersion": "現在のパネルバージョン",
"latestPanelVersion": "最新のパネルバージョン",
"panelUpToDate": "パネルは最新です",
@@ -146,7 +146,7 @@
"sent": "送信",
"received": "受信",
"panelUpdateDialog": "本当にパネルを更新しますか?",
- "panelUpdateDialogDesc": "これにより3X-UIが#version#に更新され、パネルサービスが再起動されます。",
+ "panelUpdateDialogDesc": "これによりL-UIが#version#に更新され、パネルサービスが再起動されます。",
"panelUpdateStartedPopover": "パネルの更新を開始しました",
"panelUpdateFailedTitle": "パネルの更新に失敗しました",
"panelUpdateFailedDesc": "更新が正常に完了しませんでした。サーバーのログを確認するか、コマンドラインで「x-ui update」を実行してください。",
@@ -850,6 +850,10 @@
"updateAvailable": "更新あり",
"updateConfirmTitle": "{count} 個のノードを最新バージョンに更新しますか?",
"updateConfirmContent": "選択した各ノードは最新リリースをダウンロードして再起動します。有効かつオンラインのノードのみが更新されます。",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "開発チャンネルに更新(最新コミット)",
"testConnection": "接続テスト",
"connectionOk": "接続OK ({ms} ms)",
diff --git a/internal/web/translation/pt-BR.json b/internal/web/translation/pt-BR.json
index 7047f44..00f4075 100644
--- a/internal/web/translation/pt-BR.json
+++ b/internal/web/translation/pt-BR.json
@@ -128,7 +128,7 @@
"storage": "Armazenamento",
"memory": "Memória",
"updatePanel": "Atualizar painel",
- "panelUpdateDesc": "Isso atualizará o 3X-UI para a versão mais recente e reiniciará o serviço do painel.",
+ "panelUpdateDesc": "Isso atualizará o L-UI para a versão mais recente e reiniciará o serviço do painel.",
"currentPanelVersion": "Versão atual do painel",
"latestPanelVersion": "Última versão do painel",
"panelUpToDate": "O painel está atualizado",
@@ -146,7 +146,7 @@
"sent": "Enviado",
"received": "Recebido",
"panelUpdateDialog": "Deseja realmente atualizar o painel?",
- "panelUpdateDialogDesc": "Isso atualizará o 3X-UI para #version# e reiniciará o serviço do painel.",
+ "panelUpdateDialogDesc": "Isso atualizará o L-UI para #version# e reiniciará o serviço do painel.",
"panelUpdateStartedPopover": "Atualização do painel iniciada",
"panelUpdateFailedTitle": "Falha ao atualizar o painel",
"panelUpdateFailedDesc": "A atualização não foi concluída com sucesso. Verifique os logs do servidor ou execute 'x-ui update' na linha de comando.",
@@ -850,6 +850,10 @@
"updateAvailable": "Atualização disponível",
"updateConfirmTitle": "Atualizar {count} nó(s) para a versão mais recente?",
"updateConfirmContent": "Cada nó selecionado baixa a versão mais recente e reinicia nela. Apenas nós ativos e online são atualizados.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Atualizar para o canal de desenvolvimento (último commit)",
"testConnection": "Testar conexão",
"connectionOk": "Conexão OK ({ms} ms)",
@@ -1747,7 +1751,7 @@
"report": "🕰 Relatórios agendados: {{ .RunTime }}\r\n",
"datetime": "⏰ Data&Hora: {{ .DateTime }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
- "version": "🚀 Versão 3X-UI: {{ .Version }}\r\n",
+ "version": "🚀 Versão L-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 Versão Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
diff --git a/internal/web/translation/ru-RU.json b/internal/web/translation/ru-RU.json
index 78ba7c3..da0d943 100644
--- a/internal/web/translation/ru-RU.json
+++ b/internal/web/translation/ru-RU.json
@@ -128,7 +128,7 @@
"storage": "Диск",
"memory": "Память",
"updatePanel": "Обновить панель",
- "panelUpdateDesc": "Это обновит 3X-UI до последнего релиза и перезапустит сервис панели.",
+ "panelUpdateDesc": "Это обновит L-UI до последнего релиза и перезапустит сервис панели.",
"currentPanelVersion": "Текущая версия панели",
"latestPanelVersion": "Последняя версия панели",
"panelUpToDate": "Панель обновлена",
@@ -146,7 +146,7 @@
"sent": "Отправлено",
"received": "Получено",
"panelUpdateDialog": "Вы действительно хотите обновить панель?",
- "panelUpdateDialogDesc": "Это обновит 3X-UI до версии #version# и перезапустит сервис панели.",
+ "panelUpdateDialogDesc": "Это обновит L-UI до версии #version# и перезапустит сервис панели.",
"panelUpdateStartedPopover": "Обновление панели началось",
"panelUpdateFailedTitle": "Не удалось обновить панель",
"panelUpdateFailedDesc": "Обновление не завершилось успешно. Проверьте журналы сервера или выполните 'x-ui update' в командной строке.",
@@ -850,6 +850,10 @@
"updateAvailable": "Доступно обновление",
"updateConfirmTitle": "Обновить {count} узлов до последней версии?",
"updateConfirmContent": "Каждый выбранный узел загрузит последний релиз и перезапустится. Обновляются только включённые узлы в сети.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Обновить до канала разработки (последний коммит)",
"testConnection": "Проверить соединение",
"connectionOk": "Соединение в порядке ({ms} мс)",
diff --git a/internal/web/translation/tr-TR.json b/internal/web/translation/tr-TR.json
index 75e0450..901cb4f 100644
--- a/internal/web/translation/tr-TR.json
+++ b/internal/web/translation/tr-TR.json
@@ -128,7 +128,7 @@
"storage": "Depolama",
"memory": "RAM",
"updatePanel": "Paneli Güncelle",
- "panelUpdateDesc": "Bu işlem 3X-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.",
+ "panelUpdateDesc": "Bu işlem L-UI'yi en son sürüme güncelleyecek ve panel servisini yeniden başlatacaktır.",
"currentPanelVersion": "Mevcut panel sürümü",
"latestPanelVersion": "Panelin en son sürümü",
"panelUpToDate": "Panel güncel",
@@ -146,7 +146,7 @@
"sent": "Gönderilen",
"received": "Alınan",
"panelUpdateDialog": "Gerçekten paneli güncellemek istiyor musunuz?",
- "panelUpdateDialogDesc": "Bu işlem 3X-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.",
+ "panelUpdateDialogDesc": "Bu işlem L-UI'yi #version# sürümüne güncelleyecek ve panel servisini yeniden başlatacaktır.",
"panelUpdateStartedPopover": "Panel güncellemesi başlatıldı",
"panelUpdateFailedTitle": "Panel güncellemesi başarısız oldu",
"panelUpdateFailedDesc": "Güncelleme başarıyla tamamlanamadı. Sunucu günlüklerini kontrol edin veya komut satırından 'x-ui update' çalıştırın.",
@@ -850,6 +850,10 @@
"updateAvailable": "Güncelleme mevcut",
"updateConfirmTitle": "{count} düğüm en son sürüme güncellensin mi?",
"updateConfirmContent": "Seçilen her düğüm en son sürümü indirir ve yeniden başlatılır. Yalnızca etkin ve çevrimiçi düğümler güncellenir.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Dev kanalına güncelle (son commit)",
"testConnection": "Bağlantıyı Test Et",
"connectionOk": "Bağlantı tamam ({ms} ms)",
@@ -1747,7 +1751,7 @@
"report": "🕰 Planlanmış Raporlar: {{ .RunTime }}\r\n",
"datetime": "⏰ Tarih ve Saat: {{ .DateTime }}\r\n",
"hostname": "💻 Sunucu: {{ .Hostname }}",
- "version": "🚀 3X-UI Sürümü: {{ .Version }}\r\n",
+ "version": "🚀 L-UI Sürümü: {{ .Version }}\r\n",
"xrayVersion": "📡 Xray Sürümü: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}",
"ipv4": "🌐 IPv4: {{ .IPv4 }}",
diff --git a/internal/web/translation/uk-UA.json b/internal/web/translation/uk-UA.json
index b0e4ed2..8fd25d4 100644
--- a/internal/web/translation/uk-UA.json
+++ b/internal/web/translation/uk-UA.json
@@ -128,7 +128,7 @@
"storage": "Сховище",
"memory": "Пам’ять",
"updatePanel": "Оновити панель",
- "panelUpdateDesc": "Це оновить 3X-UI до останнього релізу та перезапустить сервіс панелі.",
+ "panelUpdateDesc": "Це оновить L-UI до останнього релізу та перезапустить сервіс панелі.",
"currentPanelVersion": "Поточна версія панелі",
"latestPanelVersion": "Остання версія панелі",
"panelUpToDate": "Панель оновлено",
@@ -146,7 +146,7 @@
"sent": "Відправлено",
"received": "Отримано",
"panelUpdateDialog": "Ви дійсно хочете оновити панель?",
- "panelUpdateDialogDesc": "Це оновить 3X-UI до #version# та перезапустить сервіс панелі.",
+ "panelUpdateDialogDesc": "Це оновить L-UI до #version# та перезапустить сервіс панелі.",
"panelUpdateStartedPopover": "Розпочато оновлення панелі",
"panelUpdateFailedTitle": "Не вдалося оновити панель",
"panelUpdateFailedDesc": "Оновлення не завершилося успішно. Перевірте журнали сервера або виконайте 'x-ui update' у командному рядку.",
@@ -850,6 +850,10 @@
"updateAvailable": "Доступне оновлення",
"updateConfirmTitle": "Оновити {count} вузлів до останньої версії?",
"updateConfirmContent": "Кожен вибраний вузол завантажить останній реліз і перезапуститься. Оновлюються лише увімкнені вузли в мережі.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Оновити до каналу розробки (останній коміт)",
"testConnection": "Перевірити з'єднання",
"connectionOk": "З'єднання в порядку ({ms} мс)",
@@ -1747,7 +1751,7 @@
"report": "🕰 Заплановані звіти: {{ .RunTime }}\r\n",
"datetime": "⏰ Дата й час: {{ .DateTime }}\r\n",
"hostname": "💻 Хост: {{ .Hostname }}\r\n",
- "version": "🚀 3X-UI Версія: {{ .Version }}\r\n",
+ "version": "🚀 L-UI Версія: {{ .Version }}\r\n",
"xrayVersion": "📡 Xray Версія: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
diff --git a/internal/web/translation/vi-VN.json b/internal/web/translation/vi-VN.json
index 29f35e5..5e076db 100644
--- a/internal/web/translation/vi-VN.json
+++ b/internal/web/translation/vi-VN.json
@@ -128,7 +128,7 @@
"storage": "Lưu trữ",
"memory": "Bộ nhớ",
"updatePanel": "Cập nhật Panel",
- "panelUpdateDesc": "Điều này sẽ cập nhật 3X-UI lên bản phát hành mới nhất và khởi động lại dịch vụ panel.",
+ "panelUpdateDesc": "Điều này sẽ cập nhật L-UI lên bản phát hành mới nhất và khởi động lại dịch vụ panel.",
"currentPanelVersion": "Phiên bản panel hiện tại",
"latestPanelVersion": "Phiên bản panel mới nhất",
"panelUpToDate": "Panel đã được cập nhật",
@@ -146,7 +146,7 @@
"sent": "Đã gửi",
"received": "Đã nhận",
"panelUpdateDialog": "Bạn có chắc muốn cập nhật panel không?",
- "panelUpdateDialogDesc": "Điều này sẽ cập nhật 3X-UI lên #version# và khởi động lại dịch vụ panel.",
+ "panelUpdateDialogDesc": "Điều này sẽ cập nhật L-UI lên #version# và khởi động lại dịch vụ panel.",
"panelUpdateStartedPopover": "Bắt đầu cập nhật panel",
"panelUpdateFailedTitle": "Cập nhật panel thất bại",
"panelUpdateFailedDesc": "Bản cập nhật không hoàn tất thành công. Hãy kiểm tra nhật ký máy chủ, hoặc chạy 'x-ui update' từ dòng lệnh.",
@@ -850,6 +850,10 @@
"updateAvailable": "Có bản cập nhật",
"updateConfirmTitle": "Cập nhật {count} node lên phiên bản mới nhất?",
"updateConfirmContent": "Mỗi node đã chọn sẽ tải bản phát hành mới nhất và khởi động lại. Chỉ các node đang bật và trực tuyến được cập nhật.",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "Cập nhật lên kênh phát triển (commit mới nhất)",
"testConnection": "Kiểm tra kết nối",
"connectionOk": "Kết nối OK ({ms} ms)",
diff --git a/internal/web/translation/zh-CN.json b/internal/web/translation/zh-CN.json
index dd798da..e26d3d4 100644
--- a/internal/web/translation/zh-CN.json
+++ b/internal/web/translation/zh-CN.json
@@ -128,7 +128,7 @@
"storage": "存储",
"memory": "内存",
"updatePanel": "更新面板",
- "panelUpdateDesc": "这将把 3X-UI 更新到最新版本并重启面板服务。",
+ "panelUpdateDesc": "这将把 L-UI 更新到最新版本并重启面板服务。",
"currentPanelVersion": "当前面板版本",
"latestPanelVersion": "最新面板版本",
"panelUpToDate": "面板已是最新",
@@ -146,7 +146,7 @@
"sent": "已发送",
"received": "已接收",
"panelUpdateDialog": "您确定要更新面板吗?",
- "panelUpdateDialogDesc": "这将把 3X-UI 更新到 #version# 并重启面板服务。",
+ "panelUpdateDialogDesc": "这将把 L-UI 更新到 #version# 并重启面板服务。",
"panelUpdateStartedPopover": "已开始更新面板",
"panelUpdateFailedTitle": "面板更新失败",
"panelUpdateFailedDesc": "更新未成功完成。请检查服务器日志,或在命令行运行「x-ui update」。",
@@ -872,6 +872,10 @@
"updateAvailable": "有可用更新",
"updateConfirmTitle": "将 {count} 个节点更新到最新版本?",
"updateConfirmContent": "每个所选节点会下载最新版本并重启。仅更新已启用且在线的节点。",
+ "updateAgent": "更新 Agent",
+ "updateAgentConfirmContent": "该节点上的 agent 将下载最新发行版、校验后重启切换;更新失败时节点继续运行当前版本。",
+ "agentInstallCommand": "安装命令",
+ "agentTokenNotStored": "该节点的 token 尚未存入主控,下面的命令不含 token。token 保存在节点本机的 /etc/x-ui/agent.json 中;agent 下次通过校验的请求后会自动回填到这里。",
"updateDevChannel": "更新到开发通道(最新提交)",
"testConnection": "测试连接",
"connectionOk": "连接正常 ({ms} ms)",
diff --git a/internal/web/translation/zh-TW.json b/internal/web/translation/zh-TW.json
index 36061c1..12bd300 100644
--- a/internal/web/translation/zh-TW.json
+++ b/internal/web/translation/zh-TW.json
@@ -128,7 +128,7 @@
"storage": "儲存",
"memory": "記憶體",
"updatePanel": "更新面板",
- "panelUpdateDesc": "這將把 3X-UI 更新到最新版本並重新啟動面板服務。",
+ "panelUpdateDesc": "這將把 L-UI 更新到最新版本並重新啟動面板服務。",
"currentPanelVersion": "目前面板版本",
"latestPanelVersion": "最新面板版本",
"panelUpToDate": "面板已是最新",
@@ -146,7 +146,7 @@
"sent": "已發送",
"received": "已接收",
"panelUpdateDialog": "您確定要更新面板嗎?",
- "panelUpdateDialogDesc": "這將把 3X-UI 更新到 #version# 並重新啟動面板服務。",
+ "panelUpdateDialogDesc": "這將把 L-UI 更新到 #version# 並重新啟動面板服務。",
"panelUpdateStartedPopover": "面板更新已開始",
"panelUpdateFailedTitle": "面板更新失敗",
"panelUpdateFailedDesc": "更新未成功完成。請檢查伺服器日誌,或在命令列執行「x-ui update」。",
@@ -850,6 +850,10 @@
"updateAvailable": "有可用更新",
"updateConfirmTitle": "將 {count} 個節點更新到最新版本?",
"updateConfirmContent": "每個所選節點會下載最新版本並重新啟動。僅更新已啟用且在線的節點。",
+ "updateAgent": "Update Agent",
+ "updateAgentConfirmContent": "The agent on this node will download the latest release, verify it, and restart onto it. If the update fails, the node keeps running the current version.",
+ "agentInstallCommand": "Install Command",
+ "agentTokenNotStored": "This node's token is not stored on the master yet, so the command below has no token. The token is saved on the node itself in /etc/x-ui/agent.json; it will be filled in here automatically after the agent's next authenticated request.",
"updateDevChannel": "更新到開發通道(最新提交)",
"testConnection": "測試連線",
"connectionOk": "連線正常 ({ms} ms)",