Sfoglia il codice sorgente

Minor UI fixes (#1405)

* Update translate.en_US.toml

* Update stream_kcp.html

* Update vless.html

* Update shadowsocks.html

* Update external_proxy.html

* Update stream_sockopt.html

* Update sniffing.html

* Update tls_settings.html

* Update dokodemo.html

* Update shadowsocks.html

* Update socks.html

* Update stream_ws.html

* Update tls_settings.html

* Update index.html

* Update translate.en_US.toml

* Update translate.fa_IR.toml

* Update translate.ru_RU.toml

* Update translate.vi_VN.toml

* Update translate.zh_Hans.toml

* Update outbound.html

* Update outbound.html

* Update trojan.html

* Update vless.html

* Update stream_kcp.html

* Update xray.html

* Update stream_grpc.html

* Update custom.css

* Update stream_quic.html

* Update custom.css

* Update custom.css

* Update custom.css

* Update inbounds.html
Tara Rostami 1 anno fa
parent
commit
69651ecfb5

+ 11 - 6
web/assets/css/custom.css

@@ -18,6 +18,7 @@ body {
 html {
     --antd-wave-shadow-color: #008771;
     line-height: 1.15;
+    text-size-adjust: 100%;
     -webkit-text-size-adjust: 100%;
     -ms-text-size-adjust: 100%;
     -ms-overflow-style: scrollbar;
@@ -850,13 +851,17 @@ style attribute {
 .ant-menu,
 .ant-radio-button-wrapper {
     user-select: none;
+    -webkit-user-select: none;
 }
 
 .ant-calendar-date,
 .ant-calendar-year-panel-year,
 .ant-calendar-decade-panel-decade,
-.ant-calendar-month-panel-month {
-    border-radius: 5px;
+.ant-calendar-month-panel-month,
+.ant-checkbox-inner,
+.ant-checkbox-checked:after,
+.ant-table-row-expand-icon {
+    border-radius: 6px;
 }
 
 .ant-calendar-date:hover {
@@ -1095,15 +1100,15 @@ li.ant-select-dropdown-menu-item:empty:after {
     background-color: #313f5a;
 }
 
+.ant-select-dropdown,
+.ant-popover-inner {
+    overflow-x: hidden;
+}
 .ant-popover-inner-content {
     max-height: 400px;
     overflow-y: auto;
 }
 
-.ant-table-row-expand-icon {
-    border-radius: 6px;
-}
-
 .qr-bg {
     background-color: #fff;
     display: flex;

+ 18 - 18
web/html/xui/form/outbound.html

@@ -160,25 +160,25 @@
         <a-form-item label='{{ i18n "password" }}'>
             <a-input v-model="outbound.stream.kcp.seed"></a-input>
         </a-form-item>
-        <a-form-item label='mtu'>
+        <a-form-item label='MTU'>
             <a-input-number v-model.number="outbound.stream.kcp.mtu"></a-input-number>
         </a-form-item>
-        <a-form-item label='tti (ms)'>
+        <a-form-item label='TTI (ms)'>
             <a-input-number v-model.number="outbound.stream.kcp.tti"></a-input-number>
         </a-form-item>
-        <a-form-item label='uplink capacity (MB/S)'>
+        <a-form-item label='Uplink Capacity (MB/s)'>
             <a-input-number v-model.number="outbound.stream.kcp.upCap"></a-input-number>
         </a-form-item> 
-        <a-form-item label='downlink capacity (MB/S)'>
+        <a-form-item label='Downlink Capacity (MB/s)'>
             <a-input-number v-model.number="outbound.stream.kcp.downCap"></a-input-number>
         </a-form-item>
-        <a-form-item label='congestion'>
+        <a-form-item label='Congestion'>
             <a-switch v-model="outbound.stream.kcp.congestion"></a-switch>
         </a-form-item>
-        <a-form-item label='read buffer size (MB)'>
+        <a-form-item label='Read Buffer Size (MB)'>
             <a-input-number v-model.number="outbound.stream.kcp.readBuffer"></a-input-number>
         </a-form-item>
-        <a-form-item label='write buffer size (MB)'>
+        <a-form-item label='Write Buffer Size (MB)'>
             <a-input-number v-model.number="outbound.stream.kcp.writeBuffer"></a-input-number>
         </a-form-item>
     </template>
@@ -217,22 +217,22 @@
         </a-form-item> 
         <a-form-item label='{{ i18n "camouflage" }}'>
             <a-select v-model="outbound.stream.quic.type" :dropdown-class-name="themeSwitcher.currentTheme">
-                <a-select-option value="none">none (not camouflage)</a-select-option>
-                <a-select-option value="srtp">srtp (video call)</a-select-option>
-                <a-select-option value="utp">utp (BT download)</a-select-option>
-                <a-select-option value="wechat-video">wechat-video (WeChat video)</a-select-option>
-                <a-select-option value="dtls">dtls (DTLS 1.2 packages)</a-select-option>
-                <a-select-option value="wireguard">wireguard (wireguard packages)</a-select-option>
+                <a-select-option value="none">none (No Obfuscation)</a-select-option>
+                <a-select-option value="srtp">SRTP (Video Call)</a-select-option>
+                <a-select-option value="utp">uTP (Bittorrent)</a-select-option>
+                <a-select-option value="wechat-video">WeChat Video</a-select-option>
+                <a-select-option value="dtls">DTLS (DTLS 1.2 packages)</a-select-option>
+                <a-select-option value="wireguard">WireGuard (WireGuard Packages)</a-select-option>
             </a-select>
         </a-form-item>
     </template>
     
     <!-- grpc -->
     <template v-if="outbound.stream.network === 'grpc'">
-        <a-form-item label='serviceName'>
+        <a-form-item label='Service Name'>
             <a-input v-model.trim="outbound.stream.grpc.serviceName"></a-input>
         </a-form-item>
-        <a-form-item label='MultiMode'>
+        <a-form-item label='Multi Mode'>
             <a-switch v-model="outbound.stream.grpc.multiMode"></a-switch>
         </a-form-item>
     </template>
@@ -267,7 +267,7 @@
                     <a-select-option v-for="alpn in ALPN_OPTION" :value="alpn">[[ alpn ]]</a-select-option>
                 </a-select>
             </a-form-item>
-            <a-form-item label="Allow insecure">
+            <a-form-item label="Allow Insecure">
                 <a-switch v-model="outbound.stream.tls.allowInsecure"></a-switch>
             </a-form-item>
         </template>
@@ -283,7 +283,7 @@
                         <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key">[[ key ]]</a-select-option>
                     </a-select>
                 </a-form-item>
-                <a-form-item label="Short Id">
+                <a-form-item label="Short IDs">
                     <a-input v-model.trim="outbound.stream.reality.shortId" style="width:250px"></a-input>
                 </a-form-item>
                 <a-form-item label="SpiderX">
@@ -304,4 +304,4 @@
         <textarea style="position:absolute; left: -800px;" id="outboundJson"></textarea>
 </a-tab-pane>
 </a-tabs>
-{{end}}
+{{end}}

+ 3 - 3
web/html/xui/form/protocol/dokodemo.html

@@ -8,13 +8,13 @@
     </a-form-item>
     <a-form-item label='{{ i18n "pages.inbounds.network"}}'>
         <a-select v-model="inbound.settings.network" :dropdown-class-name="themeSwitcher.currentTheme">
-            <a-select-option value="tcp,udp">TCP+UDP</a-select-option>
+            <a-select-option value="tcp,udp">TCP,UDP</a-select-option>
             <a-select-option value="tcp">TCP</a-select-option>
             <a-select-option value="udp">UDP</a-select-option>
         </a-select>
     </a-form-item>           
-    <a-form-item label='FollowRedirect'>
+    <a-form-item label='Follow Redirect'>
         <a-switch v-model="inbound.settings.followRedirect"></a-switch>
     </a-form-item>
 </a-form>
-{{end}}
+{{end}}

+ 25 - 35
web/html/xui/form/protocol/shadowsocks.html

@@ -20,38 +20,28 @@
         </a-collapse-panel>
     </a-collapse>
 </template>
-<table width="100%" class="ant-table-tbody">
-    <tr>
-        <td>{{ i18n "encryption" }}</td>
-        <td>
-            <a-form-item>
-                <a-select v-model="inbound.settings.method" style="width: 250px;" @change="SSMethodChange" :dropdown-class-name="themeSwitcher.currentTheme">
-                    <a-select-option v-for="method in SSMethods" :value="method">[[ method ]]</a-select-option>
-                </a-select>
-            </a-form-item>
-        </td>
-    </tr>
-    <tr v-if="inbound.isSS2022">
-        <td>{{ i18n "password" }}
-            <a-icon @click="inbound.settings.password = RandomUtil.randomShadowsocksPassword()" type="sync"> </a-icon>
-        </td>
-        <td>
-            <a-form-item>
-                <a-input v-model.trim="inbound.settings.password" style="width: 250px"></a-input>
-            </a-form-item>
-        </td>
-    </tr>
-    <tr>
-        <td>{{ i18n "pages.inbounds.network" }}</td>
-        <td>
-            <a-form-item>
-                <a-select v-model="inbound.settings.network" style="width: 100px;" :dropdown-class-name="themeSwitcher.currentTheme">
-                    <a-select-option value="tcp,udp">tcp+udp</a-select-option>
-                    <a-select-option value="tcp">tcp</a-select-option>
-                    <a-select-option value="udp">udp</a-select-option>
-                </a-select>
-            </a-form-item>
-        </td>
-    </tr>
-</table>
-{{end}}
+<a-form :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
+    <a-form-item label='{{ i18n "encryption" }}'>
+        <a-select v-model="inbound.settings.method" @change="SSMethodChange" :dropdown-class-name="themeSwitcher.currentTheme">
+            <a-select-option v-for="method in SSMethods" :value="method">[[ method ]]</a-select-option>
+        </a-select>
+    </a-form-item>
+    <a-form-item v-if="inbound.isSS2022">
+        <template slot="label">
+            <a-tooltip>
+                <template slot="title">
+                    <span>{{ i18n "password" }}</span>
+                </template> Password <a-icon @click="inbound.settings.password = RandomUtil.randomShadowsocksPassword()" type="sync"></a-icon>
+            </a-tooltip>
+        </template>
+        <a-input v-model.trim="inbound.settings.password"></a-input>
+    </a-form-item>
+    <a-form-item label='{{ i18n "pages.inbounds.network" }}'>
+        <a-select v-model="inbound.settings.network" style="width: 100px;" :dropdown-class-name="themeSwitcher.currentTheme">
+            <a-select-option value="tcp,udp">TCP,UDP</a-select-option>
+            <a-select-option value="tcp">TCP</a-select-option>
+            <a-select-option value="udp">UDP</a-select-option>
+        </a-select>
+    </a-form-item>
+</a-form>
+{{end}}

+ 2 - 2
web/html/xui/form/protocol/socks.html

@@ -1,6 +1,6 @@
 {{define "form/socks"}}
 <a-form :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
-    <a-form-item label='{{ i18n "pages.inbounds.enable" }} udp'>
+    <a-form-item label='{{ i18n "pages.inbounds.enable" }} UDP'>
         <a-switch v-model="inbound.settings.udp"></a-switch>
     </a-form-item>
     <a-form-item label="IP" v-if="inbound.settings.udp">
@@ -30,4 +30,4 @@
         </a-input-group>
     </template>
 </a-form>
-{{end}}
+{{end}}

+ 3 - 3
web/html/xui/form/protocol/trojan.html

@@ -33,14 +33,14 @@
     <!-- trojan fallbacks -->
     <a-form v-for="(fallback, index) in inbound.settings.fallbacks" :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
         <a-divider style="margin:0;">
-            Fallback[[ index + 1 ]]
+            Fallback [[ index + 1 ]]
             <a-icon type="delete" @click="() => inbound.settings.delFallback(index)"
                     style="color: rgb(255, 77, 79);cursor: pointer;"/>
         </a-divider>
         <a-form-item label='Name'>
             <a-input v-model="fallback.name"></a-input>
         </a-form-item>            
-        <a-form-item label='Alpn'>
+        <a-form-item label='ALPN'>
             <a-input v-model="fallback.alpn"></a-input>
         </a-form-item>
         <a-form-item label='Path'>
@@ -55,4 +55,4 @@
     </a-form>
     <a-divider style="margin:0;"></a-divider>
 </template>
-{{end}}
+{{end}}

+ 3 - 3
web/html/xui/form/protocol/vless.html

@@ -35,14 +35,14 @@
     <!-- vless fallbacks -->
     <a-form v-for="(fallback, index) in inbound.settings.fallbacks" :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
         <a-divider style="margin:0;">
-            Fallback[[ index + 1 ]]
+            Fallback [[ index + 1 ]]
             <a-icon type="delete" @click="() => inbound.settings.delFallback(index)"
                     style="color: rgb(255, 77, 79);cursor: pointer;"/>
         </a-divider>
         <a-form-item label='Name'>
             <a-input v-model="fallback.name"></a-input>
         </a-form-item>            
-        <a-form-item label='Alpn'>
+        <a-form-item label='ALPN'>
             <a-input v-model="fallback.alpn"></a-input>
         </a-form-item>
         <a-form-item label='Path'>
@@ -55,6 +55,6 @@
             <a-input-number v-model="fallback.xver" :min="0" :max="2"></a-input-number>
         </a-form-item>
     </a-form>
-    <a-divider style="margin:0;"></a-divider>
+    <a-divider style="margin:5px 0;"></a-divider>
 </template>
 {{end}}

+ 2 - 2
web/html/xui/form/sniffing.html

@@ -1,5 +1,5 @@
 {{define "form/sniffing"}}
-<a-divider style="margin:0;"></a-divider>
+<a-divider style="margin:5px 0 0;"></a-divider>
 <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
   <a-form-item>
     <span slot="label">
@@ -19,4 +19,4 @@
     </a-checkbox-group>
   </a-form-item>
 </a-form>
-{{end}}
+{{end}}

+ 2 - 2
web/html/xui/form/stream/external_proxy.html

@@ -1,11 +1,11 @@
 {{define "form/externalProxy"}}
 <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
-    <a-divider style="margin:0;"></a-divider>
+    <a-divider style="margin:5px 0 0;"></a-divider>
     <a-form-item label="External Proxy">
         <a-switch v-model="externalProxy"></a-switch>
         <a-button v-if="externalProxy" type="primary" style="margin-left: 10px" size="small" @click="inbound.stream.externalProxy.push({forceTls: 'same', dest: '', port: 443, remark: ''})">+</a-button>
     </a-form-item>
-    <a-input-group style="margin: 5px 0;" compact v-for="(row, index) in inbound.stream.externalProxy">
+    <a-input-group style="margin: 8px 0;" compact v-for="(row, index) in inbound.stream.externalProxy">
         <template>
             <a-tooltip title="Force TLS">
                 <a-select v-model="row.forceTls" style="width:20%; margin: 0px" :dropdown-class-name="themeSwitcher.currentTheme">

+ 1 - 1
web/html/xui/form/stream/stream_grpc.html

@@ -3,7 +3,7 @@
     <a-form-item label="Service Name">
         <a-input v-model.trim="inbound.stream.grpc.serviceName"></a-input>
     </a-form-item>
-    <a-form-item label="MultiMode">
+    <a-form-item label="Multi Mode">
         <a-switch v-model="inbound.stream.grpc.multiMode"></a-switch>
     </a-form-item>
 </a-form>

+ 10 - 10
web/html/xui/form/stream/stream_kcp.html

@@ -2,10 +2,10 @@
 <a-form :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
     <a-form-item label='{{ i18n "camouflage" }}'>
         <a-select v-model="inbound.stream.kcp.type" :dropdown-class-name="themeSwitcher.currentTheme">
-            <a-select-option value="none">none (not camouflage)</a-select-option>
-            <a-select-option value="srtp">SRTP (video call)</a-select-option>
-            <a-select-option value="utp">UTP (BT DownloaD)</a-select-option>
-            <a-select-option value="wechat-video">wechat-video (WeChat video)</a-select-option>
+            <a-select-option value="none">none (No Obfuscation)</a-select-option>
+            <a-select-option value="srtp">SRTP (Video Call)</a-select-option>
+            <a-select-option value="utp">uTP (Bittorrent)</a-select-option>
+            <a-select-option value="wechat-video">WeChat Video</a-select-option>
             <a-select-option value="dtls">DTLS (DTLS 1.2 packages)</a-select-option>
             <a-select-option value="wireguard">WireGuard (WireGuard packages)</a-select-option>
         </a-select>
@@ -16,23 +16,23 @@
     <a-form-item label='MTU'>
         <a-input-number v-model.number="inbound.stream.kcp.mtu"></a-input-number>
     </a-form-item>
-    <a-form-item label='TTI(ms)'>
+    <a-form-item label='TTI (ms)'>
         <a-input-number v-model.number="inbound.stream.kcp.tti"></a-input-number>
     </a-form-item>
-    <a-form-item label='Uplink(Mb/s)'>
+    <a-form-item label='Uplink (MB/s)'>
         <a-input-number v-model.number="inbound.stream.kcp.upCap"></a-input-number>
     </a-form-item> 
-    <a-form-item label='Downlink(Mb/s)'>
+    <a-form-item label='Downlink (MB/s)'>
         <a-input-number v-model.number="inbound.stream.kcp.downCap"></a-input-number>
     </a-form-item>
     <a-form-item label='Congestion'>
         <a-switch v-model="inbound.stream.kcp.congestion"></a-switch>
     </a-form-item>
-    <a-form-item label='Read buffer(MB)'>
+    <a-form-item label='Read Buffer (MB)'>
         <a-input-number v-model.number="inbound.stream.kcp.readBuffer"></a-input-number>
     </a-form-item>
-    <a-form-item label='Write buffer(MB)'>
+    <a-form-item label='Write Buffer (MB)'>
         <a-input-number v-model.number="inbound.stream.kcp.writeBuffer"></a-input-number>
     </a-form-item>
 </a-form>
-{{end}}
+{{end}}

+ 5 - 5
web/html/xui/form/stream/stream_quic.html

@@ -12,13 +12,13 @@
     </a-form-item> 
     <a-form-item label='{{ i18n "camouflage" }}'>
         <a-select v-model="inbound.stream.quic.type" :dropdown-class-name="themeSwitcher.currentTheme">
-            <a-select-option value="none">none (not camouflage)</a-select-option>
-            <a-select-option value="srtp">SRTP (video call)</a-select-option>
-            <a-select-option value="utp">UTP (BT Download)</a-select-option>
-            <a-select-option value="wechat-video">wechat-video (WeChat video)</a-select-option>
+            <a-select-option value="none">none (No Obfuscation)</a-select-option>
+            <a-select-option value="srtp">SRTP (Video Call)</a-select-option>
+            <a-select-option value="utp">uTP (Bittorrent)</a-select-option>
+            <a-select-option value="wechat-video">WeChat Video</a-select-option>
             <a-select-option value="dtls">DTLS (DTLS 1.2 packages)</a-select-option>
             <a-select-option value="wireguard">WireGuard (WireGuard Packages)</a-select-option>
         </a-select>
     </a-form-item>
 </a-form>
-{{end}}
+{{end}}

+ 2 - 2
web/html/xui/form/stream/stream_sockopt.html

@@ -1,5 +1,5 @@
 {{define "form/streamSockopt"}}
-<a-divider style="margin:0;"></a-divider>
+<a-divider style="margin:5px 0 0;"></a-divider>
 <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
     <a-form-item label="Transparent Proxy">
         <a-switch v-model="inbound.stream.sockoptSwitch"></a-switch>
@@ -23,4 +23,4 @@
         </a-form-item>
     </template>
 </a-form>
-{{end}}
+{{end}}

+ 2 - 2
web/html/xui/form/stream/stream_ws.html

@@ -1,6 +1,6 @@
 {{define "form/streamWS"}}
 <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
-    <a-form-item label="AcceptProxyProtocol">
+    <a-form-item label="Accept Proxy Protocol">
         <a-switch v-model="inbound.stream.ws.acceptProxyProtocol"></a-switch>
     </a-form-item>
     <a-form-item label='{{ i18n "path" }}'>
@@ -20,4 +20,4 @@
         </a-input-group>
     </a-form-item>
 </a-form>
-{{end}}
+{{end}}

+ 4 - 4
web/html/xui/form/tls_settings.html

@@ -1,7 +1,7 @@
 {{define "form/tlsSettings"}}
 <!-- tls enable -->
 <a-form v-if="inbound.canEnableTls()" :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
-    <a-divider style="margin:0;"></a-divider>
+    <a-divider style="margin:3px 0;"></a-divider>
     <a-form-item label='{{ i18n "security" }}'>
         <a-radio-group v-model="inbound.stream.security" button-style="solid">
             <a-radio-button value="none">{{ i18n "none" }}</a-radio-button>
@@ -55,7 +55,7 @@
                 <a-select-option v-for="alpn in ALPN_OPTION" :value="alpn">[[ alpn ]]</a-select-option>
             </a-select>
         </a-form-item>
-        <a-form-item label="Allow insecure">
+        <a-form-item label="Allow Insecure">
             <a-switch v-model="inbound.stream.tls.settings.allowInsecure"></a-switch>
         </a-form-item>
         <a-form-item label="Reject Unknown SNI">
@@ -109,7 +109,7 @@
                 <a-select-option v-for="alpn in ALPN_OPTION" :value="alpn">[[ alpn ]]</a-select-option>
             </a-select>
         </a-form-item>
-        <a-form-item label="Allow insecure">
+        <a-form-item label="Allow Insecure">
             <a-switch v-model="inbound.stream.xtls.settings.allowInsecure"></a-switch>
         </a-form-item>
         <template v-for="cert,index in inbound.stream.xtls.certs">
@@ -171,7 +171,7 @@
                     <template slot="title">
                         <span>{{ i18n "pages.client.renew" }}</span>
                     </template>
-                    Short Ids
+                    Short IDs
                     <a-icon @click="inbound.stream.reality.shortIds = RandomUtil.randomShortId()" type="sync"> </a-icon>
                     </a-icon>
             </template>

+ 2 - 2
web/html/xui/inbounds.html

@@ -161,9 +161,9 @@
                                 </a-col>
                             </a-row>
                         </div>
-                        <div style="display: flex; align-items: center; justify-content: flex-start;">
+                        <div :style="isMobile ? '' : 'display: flex; align-items: center; justify-content: flex-start;'">
                             <a-switch v-model="enableFilter"
-                                style="margin-right: .5rem;"
+                                :style="(isMobile ? 'margin' : 'margin-right') + ': .5rem;'"
                                 @change="toggleFilter">
                                 <a-icon slot="checkedChildren" type="search"></a-icon>
                                 <a-icon slot="unCheckedChildren" type="filter"></a-icon>

+ 4 - 4
web/html/xui/index.html

@@ -132,7 +132,7 @@
                     <a-col :sm="24" :md="12">
                         <a-card hoverable>
                             {{ i18n "usage"}}:
-                            Memory [[ sizeFormat(status.appStats.mem) ]] -
+                            RAM [[ sizeFormat(status.appStats.mem) ]] -
                             Threads [[ status.appStats.threads ]]
                             </a-tooltip>
                         </a-card>
@@ -190,7 +190,7 @@
                             <a-row>
                                 <a-col :span="12">
                                     <a-icon type="arrow-up"></a-icon>
-                                    [[ sizeFormat(status.netIO.up) ]]/S
+                                    [[ sizeFormat(status.netIO.up) ]]/s
                                     <a-tooltip>
                                         <template slot="title">
                                             {{ i18n "pages.index.upSpeed" }}
@@ -200,7 +200,7 @@
                                 </a-col>
                                 <a-col :span="12">
                                     <a-icon type="arrow-down"></a-icon>
-                                    [[ sizeFormat(status.netIO.down) ]]/S
+                                    [[ sizeFormat(status.netIO.down) ]]/s
                                     <a-tooltip>
                                         <template slot="title">
                                             {{ i18n "pages.index.downSpeed" }}
@@ -650,4 +650,4 @@
 
 </script>
 </body>
-</html>
+</html>

+ 1 - 1
web/html/xui/xray.html

@@ -438,7 +438,7 @@
             { title: 'Port', dataIndex: 'port', align: 'center', width: 10, ellipsis: true }]},
         { title: '{{ i18n "pages.xray.rules.inbound"}}', children: [
             { title: 'Inbound Tag', dataIndex: 'inboundTag', align: 'center', width: 20, ellipsis: true },
-            { title: 'User email', dataIndex: 'user', align: 'center', width: 20, ellipsis: true }]},
+            { title: 'Client Email', dataIndex: 'user', align: 'center', width: 20, ellipsis: true }]},
         { title: '{{ i18n "pages.xray.rules.outbound"}}', dataIndex: 'outboundTag', align: 'center', width: 20 },
     ];
 

+ 102 - 102
web/translation/translate.en_US.toml

@@ -26,7 +26,7 @@
 "edit" = "Edit"
 "delete" = "Delete"
 "reset" = "Reset"
-"copySuccess" = "Copied successfully"
+"copySuccess" = "Copied Successfully"
 "sure" = "Sure"
 "encryption" = "Encryption"
 "transmission" = "Transmission"
@@ -40,12 +40,12 @@
 "depletingSoon" = "Depleting"
 "offline" = "Offline"
 "online" = "Online"
-"domainName" = "Domain name"
+"domainName" = "Domain Name"
 "monitor" = "Listening IP"
 "certificate" = "Certificate"
 "fail" = "Fail"
 "success" = "Success"
-"getVersion" = "Get version"
+"getVersion" = "Get Version"
 "install" = "Install"
 "clients" = "Clients"
 "usage" = "Usage"
@@ -59,11 +59,11 @@
 "settings" = "Panel Settings"
 "xray" = "Xray Settings"
 "logout" = "Logout"
-"link" = "Other"
+"link" = "Management"
 
 [pages.login]
 "title" = "Login"
-"loginAgain" = "The login time limit has expired. Please log in again."
+"loginAgain" = "Your session has expired, please log in again"
 
 [pages.login.toasts]
 "invalidFormData" = "Input data format is invalid."
@@ -74,8 +74,8 @@
 
 [pages.index]
 "title" = "System Status"
-"memory" = "Memory"
-"hard" = "Hard Disk"
+"memory" = "RAM"
+"hard" = "Disk"
 "xrayStatus" = "Status"
 "stopXray" = "Stop"
 "restartXray" = "Restart"
@@ -85,21 +85,21 @@
 "operationHours" = "Uptime"
 "systemLoad" = "System Load"
 "systemLoadDesc" = "system load average for the past 1, 5, and 15 minutes"
-"connectionTcpCountDesc" = "Total TCP connections across all network cards."
-"connectionUdpCountDesc" = "Total UDP connections across all network cards."
+"connectionTcpCountDesc" = "Total TCP connections across all network cards"
+"connectionUdpCountDesc" = "Total UDP connections across all network cards"
 "connectionCount" = "Number of Connections"
-"upSpeed" = "Total upload speed for all network cards."
-"downSpeed" = "Total download speed for all network cards."
-"totalSent" = "Total upload traffic of all network cards since system startup."
-"totalReceive" = "Total download data across all network cards since system startup."
+"upSpeed" = "Total upload speed for all network cards"
+"downSpeed" = "Total download speed for all network cards"
+"totalSent" = "Total upload data across all network cards since OS startup"
+"totalReceive" = "Total download data across all network cards since OS startup"
 "xraySwitchVersionDialog" = "Switch Xray Version"
 "xraySwitchVersionDialogDesc" = "Are you sure you want to switch the Xray version to"
-"dontRefresh" = "Installation is in progress, please do not refresh this page."
+"dontRefresh" = "Installation is in progress, please do not refresh this page"
 "logs" = "Logs"
 "config" = "Config"
 "backup" = "Backup & Restore"
 "backupTitle" = "Backup & Restore Database"
-"backupDescription" = "Remember to backup before importing a new database."
+"backupDescription" = "It is recommended to backup before importing a new database."
 "exportDatabase" = "Download Database"
 "importDatabase" = "Upload Database"
 
@@ -134,7 +134,7 @@
 "destinationPort" = "Destination Port"
 "targetAddress" = "Target Address"
 "monitorDesc" = "Leave blank by default"
-"meansNoLimit" = "Means No Limit"
+"meansNoLimit" = "Means no limit"
 "totalFlow" = "Total Flow"
 "leaveBlankToNeverExpire" = "Leave Blank to Never Expire"
 "noRecommendKeepDefault" = "No special requirements to maintain default settings"
@@ -152,16 +152,16 @@
 "cloneInboundContent" = "All settings of this inbound, except for Port, Listening IP, and Clients, will be applied to the clone."
 "cloneInboundOk" = "Clone"
 "resetAllTraffic" = "Reset All Inbounds Traffic"
-"resetAllTrafficTitle" = "Reset all inbounds traffic"
+"resetAllTrafficTitle" = "Reset All Inbounds Traffic"
 "resetAllTrafficContent" = "Are you sure you want to reset all inbounds traffic?"
 "resetInboundClientTraffics" = "Reset Clients Traffic"
-"resetInboundClientTrafficTitle" = "Reset all client traffic"
+"resetInboundClientTrafficTitle" = "Reset Clients Traffic"
 "resetInboundClientTrafficContent" = "Are you sure you want to reset all traffic for this inbound's clients?"
 "resetAllClientTraffics" = "Reset All Clients Traffic"
 "resetAllClientTrafficTitle" = "Reset all clients traffic"
 "resetAllClientTrafficContent" = "Are you sure you want to reset all traffics for all clients?"
 "delDepletedClients" = "Delete Depleted Clients"
-"delDepletedClientsTitle" = "Delete depleted clients"
+"delDepletedClientsTitle" = "Delete Depleted Clients"
 "delDepletedClientsContent" = "Are you sure you want to delete all depleted clients?"
 "email" = "Email"
 "emailDesc" = "Please provide a unique email address."
@@ -170,23 +170,23 @@
 "IPLimitlog" = "IP Log"
 "IPLimitlogDesc" = "IPs history log (before enabling inbound after it has been disabled by IP limit, you should clear the log)."
 "IPLimitlogclear" = "Clear The Log"
-"setDefaultCert" = "Set cert from panel"
+"setDefaultCert" = "Set Cert from Panel"
 "xtlsDesc" = "Xray core needs to be 1.7.5"
 "realityDesc" = "Xray core needs to be 1.8.0 or higher."
 "telegramDesc" = "use Telegram ID without @ or chat IDs ( you can get it here @userinfobot or use '/id' command in bot )"
 "subscriptionDesc" = "you can find your sub link on Details, also you can use the same name for several configurations"
 "info" = "Info"
 "same" = "Same"
-"inboundData" = "Inbound's data"
-"copyToClipboard" = "Copy to clipboard"
+"inboundData" = "Inbound's Data"
+"copyToClipboard" = "Copy to Clipboard"
 "import" = "Import"
-"importInbound" = "Import an inbound"
+"importInbound" = "Import an Inbound"
 
 [pages.client]
 "add" = "Add Client"
 "edit" = "Edit Client"
 "submitAdd" = "Add Client"
-"submitEdit" = "Save changes"
+"submitEdit" = "Save Changes"
 "clientCount" = "Number of Clients"
 "bulk" = "Add Bulk"
 "method" = "Method"
@@ -194,28 +194,28 @@
 "last" = "Last"
 "prefix" = "Prefix"
 "postfix" = "Postfix"
-"delayedStart" = "Start after first use"
-"expireDays" = "Expire days"
-"days" = "day(s)"
-"renew" = "Auto renew"
+"delayedStart" = "Start After First Use"
+"expireDays" = "Expire Days"
+"days" = "Day(s)"
+"renew" = "Auto Renew"
 "renewDesc" = "Auto renew days after expiration. 0 = disable"
 
 [pages.inbounds.toasts]
 "obtain" = "Obtain"
 
 [pages.inbounds.stream.general]
-"requestHeader" = "Request header"
+"requestHeader" = "Request Header"
 "name" = "Name"
 "value" = "Value"
 
 [pages.inbounds.stream.tcp]
-"requestVersion" = "Request version"
-"requestMethod" = "Request method"
-"requestPath" = "Request path"
-"responseVersion" = "Response version"
-"responseStatus" = "Response status"
-"responseStatusDescription" = "Response status description"
-"responseHeader" = "Response header"
+"requestVersion" = "Request Version"
+"requestMethod" = "Request Method"
+"requestPath" = "Request Path"
+"responseVersion" = "Response Version"
+"responseStatus" = "Response Status"
+"responseStatusDescription" = "Response Status Description"
+"responseHeader" = "Response Header"
 
 [pages.inbounds.stream.quic]
 "encryption" = "Encryption"
@@ -224,8 +224,8 @@
 "title" = "Settings"
 "save" = "Save"
 "infoDesc" = "Every change made here needs to be saved. Please restart the panel to apply changes."
-"restartPanel" = "Restart Panel "
-"restartPanelDesc" = "Are you sure you want to restart the panel? Click OK to restart after 3 seconds. If you cannot access the panel after restarting, please view the panel log information on the server."
+"restartPanel" = "Restart Panel"
+"restartPanelDesc" = "Are you sure you want to restart the panel? click OK to restart after 3 seconds. If you cannot access the panel after restarting, please view the panel log info on the server."
 "actions" = "Actions"
 "resetDefaultConfig" = "Reset to Default Configuration"
 "panelSettings" = "Panel Settings"
@@ -234,68 +234,68 @@
 "panelListeningIP" = "Panel Listening IP"
 "panelListeningIPDesc" = "Leave blank by default to monitor all IPs."
 "panelListeningDomain" = "Panel Listening Domain"
-"panelListeningDomainDesc" = "Leave blank by default to monitor all domains and IPs"
+"panelListeningDomainDesc" = "Leave blank by default to monitor all domains and IPs."
 "panelPort" = "Panel Port"
-"panelPortDesc" = "The port used to display this panel"
-"publicKeyPath" = "Panel Certificate Public Key File Path"
+"panelPortDesc" = "Port number for serving the panel."
+"publicKeyPath" = "Panel Certificate Public Key Path"
 "publicKeyPathDesc" = "Fill in an absolute path starting with."
-"privateKeyPath" = "Panel Certificate Private Key File Path"
+"privateKeyPath" = "Panel Certificate Private Key Path"
 "privateKeyPathDesc" = "Fill in an absolute path starting with."
 "panelUrlPath" = "Panel URL Root Path"
 "panelUrlPathDesc" = "Must start with '/' and end with."
-"pageSize" = "Pagination size"
+"pageSize" = "Pagination Size"
 "pageSizeDesc" = "Define page size for inbounds table. Set 0 to disable"
-"remarkModel" = "Remark Model and Seperation charachter"
-"sampleRemark" = "Sample remark"
+"remarkModel" = "Remark Model and Seperation Charachter"
+"sampleRemark" = "Sample Remark"
 "oldUsername" = "Current Username"
 "currentPassword" = "Current Password"
 "newUsername" = "New Username"
 "newPassword" = "New Password"
-"telegramBotEnable" = "Enable Telegram bot"
-"telegramBotEnableDesc" = "Connect to the features of this panel through the Telegram bot"
+"telegramBotEnable" = "Enable Telegram Bot"
+"telegramBotEnableDesc" = "Connect to the features of this panel through the Telegram bot."
 "telegramToken" = "Telegram Token"
-"telegramTokenDesc" = "You must get the token from the manager of Telegram bots @botfather"
+"telegramTokenDesc" = "The token you have got from @BotFather."
 "telegramChatId" = "Telegram Admin Chat IDs"
-"telegramChatIdDesc" = "Multiple Chat IDs separated by comma. use @userinfobot or use '/id' command in bot to get your Chat IDs."
+"telegramChatIdDesc" = "Multiple chat IDs separated by comma. use @userinfobot or use '/id' command in bot to get your Chat IDs."
 "telegramNotifyTime" = "Telegram bot notification time"
-"telegramNotifyTimeDesc" = "Use Crontab timing format."
+"telegramNotifyTimeDesc" = "Use crontab timing format."
 "tgNotifyBackup" = "Database Backup"
 "tgNotifyBackupDesc" = "Include database backup file with report notification."
 "tgNotifyLogin" = "Login Notification"
 "tgNotifyLoginDesc" = "Displays the username, IP address, and time when someone tries to log into your panel."
-"sessionMaxAge" = "Session maximum age"
-"sessionMaxAgeDesc" = "The duration of a login session (unit: minute)"
-"expireTimeDiff" = "Expiration threshold for notification"
-"expireTimeDiffDesc" = "Get notified about account expiration before the threshold (unit: day)"
-"trafficDiff" = "Traffic threshold for notification"
-"trafficDiffDesc" = "Get notified about traffic exhaustion before reaching the threshold (unit: GB)"
-"tgNotifyCpu" = "CPU percentage alert threshold"
-"tgNotifyCpuDesc" = "Receive notification if CPU usage exceeds this threshold (unit: %)"
+"sessionMaxAge" = "Session Duration"
+"sessionMaxAgeDesc" = "The duration of a login session. (unit: minute)"
+"expireTimeDiff" = "Client Expiration Threshold Notification"
+"expireTimeDiffDesc" = "Get notified about client expiration before the threshold. (unit: day)"
+"trafficDiff" = "Traffic Limit Threshold Notification"
+"trafficDiffDesc" = "Get notified about traffic exhaustion before reaching the threshold. (unit: GB)"
+"tgNotifyCpu" = "CPU Load Threshold Notification"
+"tgNotifyCpuDesc" = "Get notified if CPU usage exceeds this threshold. (unit: %)"
 "timeZone" = "Time zone"
 "timeZoneDesc" = "Scheduled tasks run according to the time in this time zone."
 "subSettings" = "Subscription"
-"subEnable" = "Enable service"
-"subEnableDesc" = "Subscription feature with separate configuration"
+"subEnable" = "Enable Service"
+"subEnableDesc" = "Subscription feature with separate configuration."
 "subListen" = "Listening IP"
-"subListenDesc" = "Leave blank by default to monitor all IPs"
+"subListenDesc" = "Leave blank by default to monitor all IPs."
 "subPort" = "Subscription Port"
-"subPortDesc" = "Port number for serving the subscription service must be unused in server"
-"subCertPath" = "Subscription Certificate Public Key File Path"
+"subPortDesc" = "Port number for serving the subscription service. Must be unused in server."
+"subCertPath" = "Subscription Certificate Public Key Path"
 "subCertPathDesc" = "Fill in an absolute path starting with '/'"
-"subKeyPath" = "Subscription Certificate Private Key File Path"
+"subKeyPath" = "Subscription Certificate Private Key Path"
 "subKeyPathDesc" = "Fill in an absolute path starting with '/'"
 "subPath" = "Subscription URL Root Path"
 "subPathDesc" = "Must start with '/' and end with '/'"
 "subDomain" = "Listening Domain"
-"subDomainDesc" = "Leave blank by default to monitor all domains and IPs"
+"subDomainDesc" = "Leave blank by default to monitor all domains and IPs."
 "subUpdates" = "Subscription update intervals"
-"subUpdatesDesc" = "Interval hours between updates in client application"
-"subEncrypt" = "Encrypt configs"
-"subEncryptDesc" = "Encrypt the returned configs in subscription"
-"subShowInfo" = "Show usage info"
-"subShowInfoDesc" = "Show remained traffic and date after config name"
+"subUpdatesDesc" = "Interval hours between updates in client application."
+"subEncrypt" = "Encode Configs"
+"subEncryptDesc" = "Encode the returned configs in subscription."
+"subShowInfo" = "Show Usage Info"
+"subShowInfoDesc" = "Show remained traffic and date after config name."
 "subURI" = "Reverse Proxy URI"
-"subURIDesc" = "Change base URI of subscription URL for using on behind of proxies"
+"subURIDesc" = "Change base URI of subscription URL for using on behind of proxies."
 
 [pages.xray]
 "title" = "Xray Settings"
@@ -321,9 +321,9 @@
 "FreedomStrategyDesc" = "Set the output strategy of the network in the Freedom Protocol."
 "RoutingStrategy" = "Configure Domains Routing Strategy"
 "RoutingStrategyDesc" = "Set the overall routing strategy for DNS resolving."
-"Torrent" = "Ban BitTorrent Usage"
-"TorrentDesc" = "Change the configuration template to avoid using BitTorrent by users."
-"PrivateIp" = "Ban Private IP Ranges to Connect"
+"Torrent" = "Ban BitTorrent Protocol"
+"TorrentDesc" = "Change the configuration template to avoid using BitTorrent protocol."
+"PrivateIp" = "Ban Private IPs to Connect"
 "PrivateIpDesc" = "Change the configuration template to avoid connecting to private IP ranges."
 "Ads" = "Block Ads"
 "AdsDesc" = "Change the configuration template to block ads."
@@ -331,29 +331,29 @@
 "FamilyDesc" = "DNS resolvers to block malware and adult content for family protection."
 "Speedtest" = "Block Speedtest Websites"
 "SpeedtestDesc" = "Change the configuration template to avoid connecting to speedtest websites."
-"IRIp" = "Disable connection to Iran IP ranges"
+"IRIp" = "Disable Connection to Iran IPs"
 "IRIpDesc" = "Change the configuration template to avoid connecting to Iran IP ranges."
-"IRDomain" = "Disable connection to Iran domains"
+"IRDomain" = "Disable Connection to Iran Domains"
 "IRDomainDesc" = "Change the configuration template to avoid connecting to Iran domains."
-"ChinaIp" = "Disable connection to China IP ranges"
+"ChinaIp" = "Disable Connection to China IPs"
 "ChinaIpDesc" = "Change the configuration template to avoid connecting to China IP ranges."
-"ChinaDomain" = "Disable connection to China domains"
+"ChinaDomain" = "Disable Connection to China Domains"
 "ChinaDomainDesc" = "Change the configuration template to avoid connecting to China domains."
-"RussiaIp" = "Disable connection to Russia IP ranges"
+"RussiaIp" = "Disable Connection to Russia IPs"
 "RussiaIpDesc" = "Change the configuration template to avoid connecting to Russia IP ranges."
-"RussiaDomain" = "Disable connection to Russia domains"
+"RussiaDomain" = "Disable Connection to Russia Domains"
 "RussiaDomainDesc" = "Change the configuration template to avoid connecting to Russia domains."
-"DirectIRIp" = "Direct connection to Iran IP ranges"
+"DirectIRIp" = "Direct Connection to Iran IPs"
 "DirectIRIpDesc" = "Change the configuration template for direct connecting to Iran IP ranges."
-"DirectIRDomain" = "Direct connection to Iran domains"
+"DirectIRDomain" = "Direct Connection to Iran Domains"
 "DirectIRDomainDesc" = "Change the configuration template for direct connecting to Iran domains."
-"DirectChinaIp" = "Direct connection to China IP ranges"
+"DirectChinaIp" = "Direct Connection to China IPs"
 "DirectChinaIpDesc" = "Change the configuration template for direct connecting to China IP ranges."
-"DirectChinaDomain" = "Direct connection to China domains"
+"DirectChinaDomain" = "Direct Connection to China Domains"
 "DirectChinaDomainDesc" = "Change the configuration template for direct connecting to China domains."
-"DirectRussiaIp" = "Direct connection to Russia IP ranges"
+"DirectRussiaIp" = "Direct Connection to Russia IPs"
 "DirectRussiaIpDesc" = "Change the configuration template for direct connecting to Russia IP ranges."
-"DirectRussiaDomain" = "Direct connection to Russia domains"
+"DirectRussiaDomain" = "Direct Connection to Russia Domains"
 "DirectRussiaDomainDesc" = "Change the configuration template for direct connecting to Russia domains."
 "GoogleIPv4" = "Use IPv4 for Google"
 "GoogleIPv4Desc" = "Add routing for Google to connect with IPv4."
@@ -373,7 +373,7 @@
 "InboundsDesc" = "Change the configuration template to accept specific clients."
 "Outbounds" = "Outbounds"
 "OutboundsDesc" = "Change the configuration template to define outgoing ways for this server."
-"Routings" = "routing rules."
+"Routings" = "Routing Rules"
 "RoutingsDesc" = "The priority of each rule is important!"
 "completeTemplate" = "All"
 
@@ -392,12 +392,12 @@
 "useComma" = "Comma separated items"
 
 [pages.xray.outbound]
-"addOutbound" = "Add outbound"
-"addReverse" = "Add reverse"
-"editOutbound" = "Edit outbound"
-"editReverse" = "Edit reverse"
+"addOutbound" = "Add Outbound"
+"addReverse" = "Add Reverse"
+"editOutbound" = "Edit Outbound"
+"editReverse" = "Edit Reverse"
 "tag" = "Tag"
-"tagDesc" = "Unique tag"
+"tagDesc" = "Unique Tag"
 "address" = "Address"
 "reverse" = "Reverse"
 "domain" = "Domain"
@@ -415,11 +415,11 @@
 "secretTokenDesc" = "Please copy and securely store this token in a safe place. This token is required for login and cannot be recovered from the x-ui command tool."
 
 [pages.settings.toasts]
-"modifySettings" = "Modify Settings "
-"getSettings" = "Get Settings "
-"modifyUser" = "Modify User "
+"modifySettings" = "Modify Settings"
+"getSettings" = "Get Settings"
+"modifyUser" = "Modify User"
 "originalUserPassIncorrect" = "Incorrect original username or password"
-"userPassMustBeNotEmpty" = "New username and new password cannot be empty"
+"userPassMustBeNotEmpty" = "New username and password cannot be empty"
 
 [tgbot]
 "keyboardClosed" = "❌ Custom keyboard closed!"
@@ -444,14 +444,14 @@
 "help" = "🤖 Welcome to this bot! It's designed to offer you specific data from the server, and it allows you to make modifications as needed.\r\n\r\n"
 "start" = "👋 Hello <i>{{ .Firstname }}</i>.\r\n"
 "welcome" = "🤖 Welcome to <b>{{ .Hostname }}</b> management bot.\r\n"
-"status" = "✅ Bot is ok!"
+"status" = "✅ Bot is OK!"
 "usage" = "❗ Please provide a text to search!"
 "getID" = "🆔 Your ID: <code>{{ .ID }}</code>"
 "helpAdminCommands" = "Search for a client email:\r\n<code>/usage [Email]</code>\r\n \r\nSearch for inbounds (with client stats):\r\n<code>/inbound [Remark]</code>"
 "helpClientCommands" = "To search for statistics, just use the following command:\r\n \r\n<code>/usage [UUID|Password]</code>\r\n \r\nUse UUID for vmess/vless and Password for Trojan."
 
 [tgbot.messages]
-"cpuThreshold" = "🔴 The CPU usage {{ .Percent }}% is more than threshold {{ .Threshold }}%"
+"cpuThreshold" = "🔴 CPU Load {{ .Percent }}% is more than threshold {{ .Threshold }}%"
 "selectUserFailed" = "❌ Error in user selection!"
 "userSaved" = "✅ Telegram User saved."
 "loginSuccess" = "✅ Successfully logged-in to the panel.\r\n"
@@ -466,9 +466,9 @@
 "ips" = "🔢 IPs: \r\n{{ .IPs }}\r\n"
 "serverUpTime" = "⏳ Server Uptime: {{ .UpTime }} {{ .Unit }}\r\n"
 "serverLoad" = "📈 Server Load: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n"
-"serverMemory" = "📋 Server Memory: {{ .Current }}/{{ .Total }}\r\n"
-"tcpCount" = "🔹 TcpCount: {{ .Count }}\r\n"
-"udpCount" = "🔸 UdpCount: {{ .Count }}\r\n"
+"serverMemory" = "📋 Server RAM: {{ .Current }}/{{ .Total }}\r\n"
+"tcpCount" = "🔹 TCP: {{ .Count }}\r\n"
+"udpCount" = "🔸 UDP: {{ .Count }}\r\n"
 "traffic" = "🚦 Traffic: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n"
 "xrayStatus" = "ℹ️ Xray Status: {{ .State }}\r\n"
 "username" = "👤 Username: {{ .Username }}\r\n"
@@ -487,7 +487,7 @@
 "exhaustedMsg" = "🚨 Exhausted {{ .Type }}:\r\n"
 "exhaustedCount" = "🚨 Exhausted {{ .Type }} count:\r\n"
 "disabled" = "🛑 Disabled: {{ .Disabled }}\r\n"
-"depleteSoon" = "🔜 Deplete soon: {{ .Deplete }}\r\n \r\n"
+"depleteSoon" = "🔜 Deplete Soon: {{ .Deplete }}\r\n \r\n"
 "backupTime" = "🗄 Backup Time: {{ .Time }}\r\n"
 "refreshedOn" = "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n \r\n"
 

+ 1 - 1
web/translation/translate.fa_IR.toml

@@ -59,7 +59,7 @@
 "settings" = "تنظیمات پنل"
 "xray" = "الگوی ایکس‌ری"
 "logout" = "خروج"
-"link" = "دیگر"
+"link" = "مدیریت"
 
 [pages.login]
 "title" = "ورود به سیستم"

+ 1 - 1
web/translation/translate.ru_RU.toml

@@ -59,7 +59,7 @@
 "settings" = "Настройки панели"
 "xray" = "Настройки Xray"
 "logout" = "Выход"
-"link" = "Прочее"
+"link" = "менеджмент"
 
 [pages.login]
 "title" = "Логин"

+ 1 - 1
web/translation/translate.vi_VN.toml

@@ -59,7 +59,7 @@
 "settings" = "Cài đặt bảng điều khiển"
 "logout" = "Đăng xuất"
 "xray" = "Xray Cài đặt"
-"link" = "Khác"
+"link" = "sự quản lý"
 
 [pages.login]
 "title" = "Đăng nhập"

+ 1 - 1
web/translation/translate.zh_Hans.toml

@@ -59,7 +59,7 @@
 "settings" = "面板设置"
 "xray" = "Xray 设置"
 "logout" = "退出登录"
-"link" = "其他"
+"link" = "管理"
 
 [pages.login]
 "title" = "登录"