Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
authorShishkevich D. <135337715+shishkevichd@users.noreply.github.com>2025-03-15 14:15:46 +0300
committerGitHub <noreply@github.com>2025-03-15 14:15:46 +0300
commitb9307c6c9c26c7d87819ef60c18eccce134f09ea (patch)
tree5770a7ecbc87a9b90b9d719c27109d43a9512bdd /web
parentd30cdbf49a7443a62f599d4f91a4f1ebceb1c666 (diff)
chore: pretty 'Overview' page (#2772)
* chore: pretty 'Overview' page * chore: some improvements in 'overview page' - reduced font size - added caption to buttons - fixed display of xray state - xray version display returned
Diffstat (limited to 'web')
-rw-r--r--web/html/xui/index.html389
-rw-r--r--web/translation/translate.en_US.toml16
-rw-r--r--web/translation/translate.es_ES.toml14
-rw-r--r--web/translation/translate.fa_IR.toml12
-rw-r--r--web/translation/translate.id_ID.toml14
-rw-r--r--web/translation/translate.ja_JP.toml14
-rw-r--r--web/translation/translate.pt_BR.toml14
-rw-r--r--web/translation/translate.ru_RU.toml14
-rw-r--r--web/translation/translate.tr_TR.toml14
-rw-r--r--web/translation/translate.uk_UA.toml14
-rw-r--r--web/translation/translate.vi_VN.toml14
-rw-r--r--web/translation/translate.zh_CN.toml14
-rw-r--r--web/translation/translate.zh_TW.toml12
13 files changed, 323 insertions, 232 deletions
diff --git a/web/html/xui/index.html b/web/html/xui/index.html
index e78940fd..bd7d3878 100644
--- a/web/html/xui/index.html
+++ b/web/html/xui/index.html
@@ -24,13 +24,35 @@
user-select: none;
cursor: pointer;
}
- .dark .ant-backup-list-item svg {
- color: var(--dark-color-text-primary);
+ .dark .ant-backup-list-item svg,
+ .dark .ant-card-actions>li>*,
+ .dark .ant-badge-status-text,
+ .dark .ant-statistic-title,
+ .dark .ant-statistic-content,
+ .dark .ant-card-extra {
+ color: var(--dark-color-text-primary) !important;
+ }
+ .dark .ant-card-actions>li>*:hover {
+ color: var(--color-primary-100) !important;
}
.dark .ant-backup-list,
- .dark .ant-xray-version-list {
+ .dark .ant-xray-version-list,
+ .dark .ant-card-actions,
+ .dark .ant-card-actions>li:not(:last-child) {
border-color: var(--dark-color-stroke);
}
+ .ant-card-actions {
+ background: transparent !important;
+ }
+ .ant-statistic-content-prefix {
+ font-size: 20px;
+ }
+ .ant-statistic-content-value {
+ font-size: 18px;
+ }
+ .ip-hidden {
+ filter: blur(10px);
+ }
</style>
<body>
@@ -47,7 +69,7 @@
show-icon closable>
</a-alert>
</transition>
- <transition name="list" appear>
+ <transition v-if="status.isLoaded" name="list" appear>
<a-row>
<a-card hoverable>
<a-row>
@@ -100,172 +122,191 @@
</a-row>
</transition>
<transition name="list" appear>
- <a-row>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>3X-UI:</b>
- <a rel="noopener" href="https://github.com/MHSanaei/3x-ui/releases" target="_blank"><a-tag color="green">v{{ .cur_ver }}</a-tag></a>
- <a rel="noopener" href="https://t.me/XrayUI" target="_blank"><a-tag color="green">@XrayUI</a-tag></a>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>{{ i18n "pages.index.operationHours" }}:</b>
- <a-tag :color="status.xray.color">Xray: [[ TimeFormatter.formatSecond(status.appStats.uptime) ]]</a-tag>
- <a-tag color="green">OS: [[ TimeFormatter.formatSecond(status.uptime) ]]</a-tag>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>{{ i18n "pages.index.xrayStatus" }}:</b>
- <a-tag style="text-transform: capitalize;" :color="status.xray.color">[[ status.xray.state ]] </a-tag>
- <a-popover v-if="status.xray.state === State.Error" :overlay-class-name="themeSwitcher.currentTheme">
- <span slot="title" style="font-size: 12pt">An error occurred while running Xray
- <a-tag color="purple" style="cursor: pointer; float: right;" @click="openLogs()">{{ i18n "pages.index.logs" }}</a-tag>
- </span>
- <template slot="content">
- <p style="max-width: 400px" v-for="line in status.xray.errorMsg.split('\n')">[[ line ]]</p>
- </template>
- <a-icon type="question-circle"></a-icon>
- </a-popover>
- <a-tag color="purple" style="cursor: pointer;" @click="stopXrayService">{{ i18n "pages.index.stopXray" }}</a-tag>
- <a-tag color="purple" style="cursor: pointer;" @click="restartXrayService">{{ i18n "pages.index.restartXray" }}</a-tag>
- <a-tag color="purple" style="cursor: pointer;" @click="openSelectV2rayVersion">v[[ status.xray.version ]]</a-tag>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>{{ i18n "menu.link" }}:</b>
- <a-tag color="purple" style="cursor: pointer;" @click="openLogs()">{{ i18n "pages.index.logs" }}</a-tag>
- <a-tag color="purple" style="cursor: pointer;" @click="openConfig">{{ i18n "pages.index.config" }}</a-tag>
- <a-tag color="purple" style="cursor: pointer;" @click="openBackup">{{ i18n "pages.index.backup" }}</a-tag>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>{{ i18n "pages.index.systemLoad" }}:</b>
- <a-tag color="green">
- <a-tooltip>
- [[ status.loads[0] ]] | [[ status.loads[1] ]] | [[ status.loads[2] ]]
- <template slot="title">
- {{ i18n "pages.index.systemLoadDesc" }}
+ <template v-if="!status.isLoaded">
+ <a-card hoverable style="text-align: center; padding: 30px 0; margin-top: 10px;">
+ <a-spin size="large"></a-spin>
+ </a-card>
+ </template>
+ <template v-else>
+ <a-row>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.xrayStatus" }}' hoverable>
+ <template #extra>
+ <template v-if="status.xray.state != State.Error">
+ <a-badge :text="status.xray.state" :color="status.xray.color" style="text-transform: capitalize;"/>
</template>
- </a-tooltip>
- </a-tag>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <b>{{ i18n "usage"}}:</b>
- <a-tag color="green"> RAM: [[ SizeFormatter.sizeFormat(status.appStats.mem) ]] </a-tag>
- <a-tag color="green"> Threads: [[ status.appStats.threads ]] </a-tag>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <a-row>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="global"></a-icon> IPv4
- <template slot="title">
- [[ status.publicIP.ipv4 ]]
+ <template v-else>
+ <a-popover :overlay-class-name="themeSwitcher.currentTheme">
+ <span slot="title" style="font-size: 12pt">An error occurred while running Xray
+ <a-tag color="purple" style="cursor: pointer; float: right;" @click="openLogs()">{{ i18n "pages.index.logs" }}</a-tag>
+ </span>
+ <template slot="content">
+ <p style="max-width: 400px" v-for="line in status.xray.errorMsg.split('\n')">[[ line ]]</p>
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="global"></a-icon> IPv6
- <template slot="title">
- [[ status.publicIP.ipv6 ]]
+ <a-badge :text="status.xray.state" :color="status.xray.color" style="text-transform: capitalize;"/>
+ </a-popover>
+ </template>
+ </template>
+ <template #actions>
+ <a-space direction="horizontal" @click="stopXrayService" style="justify-content: center;">
+ <a-icon type="poweroff"></a-icon>
+ <span>{{ i18n "pages.index.stopXray" }}</span>
+ </a-space>
+ <a-space direction="horizontal" @click="restartXrayService" style="justify-content: center;">
+ <a-icon type="reload"></a-icon>
+ <span>{{ i18n "pages.index.restartXray" }}</span>
+ </a-space>
+ <a-space direction="horizontal" @click="openSelectV2rayVersion" style="justify-content: center;">
+ <a-icon type="tool"></a-icon>
+ <span>v[[ status.xray.version ]]</span>
+ </a-space>
+ </template>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "menu.link" }}' hoverable>
+ <template #actions>
+ <a-space direction="horizontal" @click="openLogs()" style="justify-content: center;">
+ <a-icon type="bars"></a-icon>
+ <span>{{ i18n "pages.index.logs" }}</span>
+ </a-space>
+ <a-space direction="horizontal" @click="openConfig" style="justify-content: center;">
+ <a-icon type="control"></a-icon>
+ <span>{{ i18n "pages.index.config" }}</span>
+ </a-space>
+ <a-space direction="horizontal" @click="openBackup" style="justify-content: center;">
+ <a-icon type="cloud-server"></a-icon>
+ <span>{{ i18n "pages.index.backup" }}</span>
+ </a-space>
+ </template>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='3X-UI' hoverable>
+ <a rel="noopener" href="https://github.com/MHSanaei/3x-ui/releases" target="_blank"><a-tag color="green">v{{ .cur_ver }}</a-tag></a>
+ <a rel="noopener" href="https://t.me/XrayUI" target="_blank"><a-tag color="green">@XrayUI</a-tag></a>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.operationHours" }}' hoverable>
+ <a-tag :color="status.xray.color">Xray: [[ TimeFormatter.formatSecond(status.appStats.uptime) ]]</a-tag>
+ <a-tag color="green">OS: [[ TimeFormatter.formatSecond(status.uptime) ]]</a-tag>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.systemLoad" }}' hoverable>
+ <a-tag color="green">
+ <a-tooltip>
+ [[ status.loads[0] ]] | [[ status.loads[1] ]] | [[ status.loads[2] ]]
+ <template slot="title">
+ {{ i18n "pages.index.systemLoadDesc" }}
+ </template>
+ </a-tooltip>
+ </a-tag>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "usage"}}' hoverable>
+ <a-tag color="green"> RAM: [[ SizeFormatter.sizeFormat(status.appStats.mem) ]] </a-tag>
+ <a-tag color="green"> Threads: [[ status.appStats.threads ]] </a-tag>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.ipAddresses" }}' hoverable>
+ <template #extra>
+ <a-tooltip>
+ <template #title>
+ {{ i18n "pages.index.toggleIpVisibility" }}
+ </template>
+ <a-icon :type="showIp ? 'eye' : 'eye-invisible'" :style="{ fontSize: '1rem' }" @click="showIp = !showIp"></a-icon>
+ </a-tooltip>
+ </template>
+ <a-row :class="showIp ? 'ip-visible' : 'ip-hidden'">
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title="IPv4" :value="status.publicIP.ipv4">
+ <template #prefix>
+ <a-icon type="global" />
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- </a-row>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <a-row>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="swap"></a-icon> TCP: [[ status.tcpCount ]]
- <template slot="title">
- {{ i18n "pages.index.connectionTcpCountDesc" }}
+ </a-statistic>
+ </a-col>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title="IPv6" :value="status.publicIP.ipv6">
+ <template #prefix>
+ <a-icon type="global" />
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="swap"></a-icon> UDP: [[ status.udpCount ]]
- <template slot="title">
- {{ i18n "pages.index.connectionUdpCountDesc" }}
+ </a-statistic>
+ </a-col>
+ </a-row>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.connectionCount" }}' hoverable>
+ <a-row>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title="TCP" :value="status.tcpCount">
+ <template #prefix>
+ <a-icon type="swap" />
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- </a-row>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <a-row>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="arrow-up"></a-icon> Up: [[ SizeFormatter.sizeFormat(status.netIO.up) ]]/s
- <template slot="title">
- {{ i18n "pages.index.upSpeed" }}
+ </a-statistic>
+ </a-col>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title="UDP" :value="status.udpCount">
+ <template #prefix>
+ <a-icon type="swap" />
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="arrow-down"></a-icon> Down: [[ SizeFormatter.sizeFormat(status.netIO.down) ]]/s
- <template slot="title">
- {{ i18n "pages.index.downSpeed" }}
+ </a-statistic>
+ </a-col>
+ </a-row>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.overallSpeed" }}' hoverable>
+ <a-row>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title='{{ i18n "pages.index.upload" }}' :value="SizeFormatter.sizeFormat(status.netIO.up)">
+ <template #prefix>
+ <a-icon type="arrow-up" />
</template>
- </a-tooltip>
- </a-tag>
- </a-col>
- </a-row>
- </a-card>
- </a-col>
- <a-col :sm="24" :lg="12">
- <a-card hoverable>
- <a-row>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="cloud-upload"></a-icon>
- <template slot="title">
- {{ i18n "pages.index.totalSent" }}
- </template> Out: [[ SizeFormatter.sizeFormat(status.netTraffic.sent) ]]
- </a-tooltip>
- </a-tag>
- </a-col>
- <a-col :span="12">
- <a-tag>
- <a-tooltip>
- <a-icon type="cloud-download"></a-icon>
- <template slot="title">
- {{ i18n "pages.index.totalReceive" }}
- </template> In: [[ SizeFormatter.sizeFormat(status.netTraffic.recv) ]]
- </a-tooltip>
- </a-tag>
- </a-col>
- </a-row>
- </a-card>
- </a-col>
- </a-row>
+ <template #suffix>
+ /s
+ </template>
+ </a-statistic>
+ </a-col>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title='{{ i18n "pages.index.download" }}' :value="SizeFormatter.sizeFormat(status.netIO.down)">
+ <template #prefix>
+ <a-icon type="arrow-down" />
+ </template>
+ <template #suffix>
+ /s
+ </template>
+ </a-statistic>
+ </a-col>
+ </a-row>
+ </a-card>
+ </a-col>
+ <a-col :sm="24" :lg="12">
+ <a-card title='{{ i18n "pages.index.totalData" }}' hoverable>
+ <a-row>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title='{{ i18n "pages.index.sent" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.sent)">
+ <template #prefix>
+ <a-icon type="cloud-upload" />
+ </template>
+ </a-statistic>
+ </a-col>
+ <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
+ <a-statistic title='{{ i18n "pages.index.received" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.recv)">
+ <template #prefix>
+ <a-icon type="cloud-download" />
+ </template>
+ </a-statistic>
+ </a-col>
+ </a-row>
+ </a-card>
+ </a-col>
+ </a-row>
+ </template>
</transition>
</a-spin>
</a-layout-content>
@@ -279,7 +320,7 @@
<a-list-item-meta>
<template #title>[[ version ]]</template>
</a-list-item-meta>
- <a-radio :checked="version === `v${status.xray.version}`" @click="switchV2rayVersion(version)"></a-radio>
+ <a-radio :class="themeSwitcher.currentTheme" :checked="version === `v${status.xray.version}`" @click="switchV2rayVersion(version)"></a-radio>
</a-list-item>
</a-list>
</a-modal>
@@ -360,9 +401,9 @@
{{template "textModal"}}
<script>
const State = {
- Running: "running",
- Stop: "stop",
- Error: "error",
+ Running: "running",
+ Stop: "stop",
+ Error: "error",
}
Object.freeze(State);
@@ -393,7 +434,7 @@
}
class Status {
- constructor(data) {
+ constructor(data, isLoaded = false) {
this.cpu = new CurTotal(0, 0);
this.cpuCores = 0;
this.logicalPro = 0;
@@ -413,8 +454,10 @@
this.xray = { state: State.Stop, errorMsg: "", version: "", color: "" };
if (data == null) {
- return;
+ return;
}
+
+ this.isLoaded = isLoaded;
this.cpu = new CurTotal(data.cpu, 100);
this.cpuCores = data.cpuCores;
this.logicalPro = data.logicalPro;
@@ -536,6 +579,8 @@
spinning: false,
loadingTip: '{{ i18n "loading"}}',
showAlert: false,
+ showIp: false,
+ isMobile: window.innerWidth <= 768
},
methods: {
loading(spinning, tip = '{{ i18n "loading"}}') {
@@ -546,14 +591,14 @@
try {
const msg = await HttpUtil.post('/server/status');
if (msg.success) {
- this.setStatus(msg.obj);
+ this.setStatus(msg.obj, true);
}
} catch (e) {
console.error("Failed to get status:", e);
}
},
- setStatus(data) {
- this.status = new Status(data);
+ setStatus(data, isLoaded = false) {
+ this.status = new Status(data, isLoaded);
},
async openSelectV2rayVersion() {
this.loading(true);
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index f09a9e79..f3c88f57 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -99,19 +99,21 @@
"operationHours" = "Uptime"
"systemLoad" = "System Load"
"systemLoadDesc" = "System load average for the past 1, 5, and 15 minutes"
-"connectionTcpCountDesc" = "Total TCP connections across the system"
-"connectionUdpCountDesc" = "Total UDP connections across the system"
"connectionCount" = "Connection Stats"
-"upSpeed" = "Overall upload speed across the system"
-"downSpeed" = "Overall download speed across the system"
-"totalSent" = "Total data sent across the system since OS startup"
-"totalReceive" = "Total data received across the system since OS startup"
+"ipAddresses" = "IP addresses"
+"toggleIpVisibility" = "Toggle visibility of the IP"
+"overallSpeed" = "Overall speed"
+"upload" = "Upload"
+"download" = "Download"
+"totalData" = "Total data"
+"sent" = "Sent"
+"received" = "Received"
"xraySwitchVersionDialog" = "Change Xray Version"
"xraySwitchVersionDialogDesc" = "Are you sure you want to change the Xray version to"
"dontRefresh" = "Installation is in progress, please do not refresh this page"
"logs" = "Logs"
"config" = "Config"
-"backup" = "Backup & Restore"
+"backup" = "Backup"
"backupTitle" = "Database Backup & Restore"
"exportDatabase" = "Back Up"
"exportDatabaseDesc" = "Click to download a .db file containing a backup of your current database to your device."
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index e1f3af28..05ab33d8 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -102,16 +102,20 @@
"connectionTcpCountDesc" = "Conexiones TCP totales en todas las tarjetas de red."
"connectionUdpCountDesc" = "Conexiones UDP totales en todas las tarjetas de red."
"connectionCount" = "Número de Conexiones"
-"upSpeed" = "Velocidad de Subida Total para Todas las Tarjetas de Red."
-"downSpeed" = "Velocidad de Bajada Total para Todas las Tarjetas de Red."
-"totalSent" = "Tráfico Total de Subida de Todas las Tarjetas de Red desde el inicio del sistema."
-"totalReceive" = "Datos Descargados Totales en Todas las Tarjetas de Red desde el inicio del sistema."
+"ipAddresses" = "Direcciones IP"
+"toggleIpVisibility" = "Alternar visibilidad de la IP"
+"overallSpeed" = "Velocidad general"
+"upload" = "Subida"
+"download" = "Descarga"
+"totalData" = "Datos totales"
+"sent" = "Enviado"
+"received" = "Recibido"
"xraySwitchVersionDialog" = "Cambiar Versión de Xray"
"xraySwitchVersionDialogDesc" = "¿Estás seguro de que deseas cambiar la versión de Xray a"
"dontRefresh" = "La instalación está en progreso, por favor no actualices esta página."
"logs" = "Registros"
"config" = "Configuración"
-"backup" = "Copia de Seguridad y Restauración"
+"backup" = "Сopia de Seguridad"
"backupTitle" = "Copia de Seguridad y Restauración de la Base de Datos"
"exportDatabase" = "Copia de seguridad"
"exportDatabaseDesc" = "Haz clic para descargar un archivo .db que contiene una copia de seguridad de tu base de datos actual en tu dispositivo."
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index 319a3a74..7a56a3d1 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -102,10 +102,14 @@
"connectionTcpCountDesc" = "در تمام‌شبکه‌ها TCP مجموع‌اتصالات"
"connectionUdpCountDesc" = "در تمام‌شبکه‌ها UDP مجموع‌اتصالات"
"connectionCount" = "تعداد کانکشن ها"
-"upSpeed" = "سرعت کلی آپلود در تمام‌شبکه‌ها"
-"downSpeed" = "‌سرعت کلی دانلود در تمام‌شبکه‌ها"
-"totalSent" = "مجموع ترافیک ارسال‌‌شده پس‌از شروع‌به‌کار سیستم‌عامل"
-"totalReceive" = "مجموع ترافیک دریافت‌شده پس‌از شروع‌به‌کار سیستم‌عامل"
+"ipAddresses" = "آدرس‌های IP"
+"toggleIpVisibility" = "تغییر وضعیت نمایش IP"
+"overallSpeed" = "سرعت کلی"
+"upload" = "آپلود"
+"download" = "دانلود"
+"totalData" = "داده‌های کل"
+"sent" = "ارسال شده"
+"received" = "دریافت شده"
"xraySwitchVersionDialog" = "تغییر نسخه ایکس‌ری"
"xraySwitchVersionDialogDesc" = "آیا از تغییر نسخه‌ مطمئن هستید؟"
"dontRefresh" = "در حال نصب، لطفا صفحه را رفرش نکنید"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index e578f2d6..ae68cdd3 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -102,16 +102,20 @@
"connectionTcpCountDesc" = "Total koneksi TCP di seluruh sistem"
"connectionUdpCountDesc" = "Total koneksi UDP di seluruh sistem"
"connectionCount" = "Statistik Koneksi"
-"upSpeed" = "Kecepatan unggah keseluruhan di seluruh sistem"
-"downSpeed" = "Kecepatan unduh keseluruhan di seluruh sistem"
-"totalSent" = "Total data terkirim di seluruh sistem sejak startup OS"
-"totalReceive" = "Total data diterima di seluruh sistem sejak startup OS"
+"ipAddresses" = "Alamat IP"
+"toggleIpVisibility" = "Alihkan visibilitas IP"
+"overallSpeed" = "Kecepatan keseluruhan"
+"upload" = "Unggah"
+"download" = "Unduh"
+"totalData" = "Total data"
+"sent" = "Dikirim"
+"received" = "Diterima"
"xraySwitchVersionDialog" = "Ganti Versi Xray"
"xraySwitchVersionDialogDesc" = "Apakah Anda yakin ingin mengubah versi Xray menjadi"
"dontRefresh" = "Instalasi sedang berlangsung, harap jangan menyegarkan halaman ini"
"logs" = "Log"
"config" = "Konfigurasi"
-"backup" = "Cadangan & Pulihkan"
+"backup" = "Cadangan"
"backupTitle" = "Cadangan & Pulihkan Database"
"exportDatabase" = "Cadangkan"
"exportDatabaseDesc" = "Klik untuk mengunduh file .db yang berisi cadangan dari database Anda saat ini ke perangkat Anda."
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index ffaf7abd..9e73e604 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -102,16 +102,20 @@
"connectionTcpCountDesc" = "システム内のすべてのTCP接続数"
"connectionUdpCountDesc" = "システム内のすべてのUDP接続数"
"connectionCount" = "接続数"
-"upSpeed" = "総アップロード速度"
-"downSpeed" = "総ダウンロード速度"
-"totalSent" = "システム起動以降の送信データ量"
-"totalReceive" = "システム起動以降の受信データ量"
+"ipAddresses" = "IPアドレス"
+"toggleIpVisibility" = "IPの表示を切り替える"
+"overallSpeed" = "全体の速度"
+"upload" = "アップロード"
+"download" = "ダウンロード"
+"totalData" = "総データ量"
+"sent" = "送信"
+"received" = "受信"
"xraySwitchVersionDialog" = "Xrayバージョン切り替え"
"xraySwitchVersionDialogDesc" = "Xrayのバージョンを切り替えますか?"
"dontRefresh" = "インストール中、このページをリロードしないでください"
"logs" = "ログ"
"config" = "設定"
-"backup" = "バックアップと復元"
+"backup" = "バックアップ"
"backupTitle" = "データベースのバックアップと復元"
"exportDatabase" = "バックアップ"
"exportDatabaseDesc" = "クリックして、現在のデータベースのバックアップを含む .db ファイルをデバイスにダウンロードします。"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index dc33ac24..b259cdaf 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -102,16 +102,20 @@
"connectionTcpCountDesc" = "Total de conexões TCP no sistema"
"connectionUdpCountDesc" = "Total de conexões UDP no sistema"
"connectionCount" = "Estatísticas de Conexão"
-"upSpeed" = "Velocidade total de upload no sistema"
-"downSpeed" = "Velocidade total de download no sistema"
-"totalSent" = "Dados totais enviados desde a inicialização do sistema"
-"totalReceive" = "Dados totais recebidos desde a inicialização do sistema"
+"ipAddresses" = "Endereços IP"
+"toggleIpVisibility" = "Alternar visibilidade do IP"
+"overallSpeed" = "Velocidade geral"
+"upload" = "Upload"
+"download" = "Download"
+"totalData" = "Dados totais"
+"sent" = "Enviado"
+"received" = "Recebido"
"xraySwitchVersionDialog" = "Alterar Versão do Xray"
"xraySwitchVersionDialogDesc" = "Tem certeza de que deseja alterar a versão do Xray para"
"dontRefresh" = "Instalação em andamento, por favor não atualize a página"
"logs" = "Logs"
"config" = "Configuração"
-"backup" = "Backup e Restauração"
+"backup" = "Backup"
"backupTitle" = "Backup e Restauração do Banco de Dados"
"exportDatabase" = "Backup"
"exportDatabaseDesc" = "Clique para baixar um arquivo .db contendo um backup do seu banco de dados atual para o seu dispositivo."
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 80787e24..30602d90 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -102,16 +102,20 @@
"connectionTcpCountDesc" = "Общее количество подключений TCP по всем сетевым картам."
"connectionUdpCountDesc" = "Общее количество подключений UDP по всем сетевым картам."
"connectionCount" = "Количество соединений"
-"upSpeed" = "Общая скорость отправки для всех сетей"
-"downSpeed" = "Общая скорость загрузки для всех сетей"
-"totalSent" = "Общий объем отправляемых данных с момента запуска системы"
-"totalReceive" = "Общий объем полученных данных для всех сетей с момента запуска системы."
+"ipAddresses" = "IP-адреса"
+"toggleIpVisibility" = "Переключить видимость IP"
+"overallSpeed" = "Общая скорость"
+"upload" = "Отправка"
+"download" = "Загрузка"
+"totalData" = "Общий объем данных"
+"sent" = "Отправлено"
+"received" = "Получено"
"xraySwitchVersionDialog" = "Переключить версию Xray"
"xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?"
"dontRefresh" = "Установка в процессе. Не обновляйте страницу"
"logs" = "Логи"
"config" = "Конфигурация"
-"backup" = "Резервное копирование и восстановление"
+"backup" = "Резервная копия"
"backupTitle" = "База данных резервных копий"
"exportDatabase" = "Экспорт базы данных"
"exportDatabaseDesc" = "Нажмите, чтобы скачать файл .db, содержащий резервную копию вашей текущей базы данных на ваше устройство."
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index ee773b21..1cbaf701 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.to