Merge branch 'MHSanaei:main' into develop-bot/add_client_feature

This commit is contained in:
nistootsin 2025-03-18 02:37:15 +03:30 committed by GitHub
commit 2bcdc97203
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 155 additions and 79 deletions

View file

@ -473,8 +473,8 @@
</transition> </transition>
</a-layout> </a-layout>
{{template "js" .}} {{template "js" .}}
{{template "component/themeSwitcher" .}} {{template "component/aThemeSwitch" .}}
{{template "component/password" .}} {{template "component/aPasswordInput" .}}
<script> <script>
class User { class User {
constructor() { constructor() {

View file

@ -1,33 +1,23 @@
{{define "menuItems"}} {{define "menuItems"}}
<a-menu-item key="{{ .base_path }}panel/"> <a-menu-item key="{{ .base_path }}panel/">
<a-icon type="dashboard"></a-icon> <a-icon type="dashboard"></a-icon>
<span> <span>{{ i18n "menu.dashboard"}}</span>
<b>{{ i18n "menu.dashboard"}}</b>
</span>
</a-menu-item> </a-menu-item>
<a-menu-item key="{{ .base_path }}panel/inbounds"> <a-menu-item key="{{ .base_path }}panel/inbounds">
<a-icon type="user"></a-icon> <a-icon type="user"></a-icon>
<span> <span>{{ i18n "menu.inbounds"}}</span>
<b>{{ i18n "menu.inbounds"}}</b>
</span>
</a-menu-item> </a-menu-item>
<a-menu-item key="{{ .base_path }}panel/settings"> <a-menu-item key="{{ .base_path }}panel/settings">
<a-icon type="setting"></a-icon> <a-icon type="setting"></a-icon>
<span> <span>{{ i18n "menu.settings"}}</span>
<b>{{ i18n "menu.settings"}}</b>
</span>
</a-menu-item> </a-menu-item>
<a-menu-item key="{{ .base_path }}panel/xray"> <a-menu-item key="{{ .base_path }}panel/xray">
<a-icon type="tool"></a-icon> <a-icon type="tool"></a-icon>
<span> <span>{{ i18n "menu.xray"}}</span>
<b>{{ i18n "menu.xray"}}</b>
</span>
</a-menu-item> </a-menu-item>
<a-menu-item key="{{ .base_path }}logout"> <a-menu-item key="{{ .base_path }}logout">
<a-icon type="logout"></a-icon> <a-icon type="logout"></a-icon>
<span> <span>{{ i18n "menu.logout"}}</span>
<b>{{ i18n "menu.logout"}}</b>
</span>
</a-menu-item> </a-menu-item>
{{end}} {{end}}

View file

@ -0,0 +1,55 @@
{{define "component/customStatistic"}}
<template>
<a-statistic :title="title" :value="value">
<template #prefix>
<slot name="prefix"></slot>
</template>
<template #suffix>
<slot name="suffix"></slot>
</template>
</a-statistic>
</template>
{{end}}
{{define "component/aCustomStatistic"}}
<style>
.dark .ant-statistic-title,
.dark .ant-statistic-content {
color: var(--dark-color-text-primary) !important
}
.dark .ant-statistic-title {
user-select: none;
opacity: 0.55;
}
.ant-statistic-title {
margin-bottom: 0 !important;
}
.ant-statistic-content-prefix {
margin-right: 6px !important;
}
.ant-statistic-content-prefix,
.ant-statistic-content-value {
font-size: 1.05rem;
}
</style>
<script>
Vue.component('a-custom-statistic', {
props: {
'title': {
type: String,
required: false,
},
'value': {
type: String,
required: false
}
},
template: `{{template "component/customStatistic"}}`,
});
</script>
{{end}}

View file

@ -12,7 +12,7 @@
</template> </template>
{{end}} {{end}}
{{define "component/password"}} {{define "component/aPasswordInput"}}
<script> <script>
Vue.component('a-password-input', { Vue.component('a-password-input', {
props: { props: {

View file

@ -12,7 +12,7 @@
</template> </template>
{{end}} {{end}}
{{define "component/persianDatepicker"}} {{define "component/aPersianDatepicker"}}
<link rel="stylesheet" href="{{ .base_path }}assets/persian-datepicker/persian-datepicker.min.css?{{ .cur_ver }}" /> <link rel="stylesheet" href="{{ .base_path }}assets/persian-datepicker/persian-datepicker.min.css?{{ .cur_ver }}" />
<script src="{{ .base_path }}assets/moment/moment-jalali.min.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/moment/moment-jalali.min.js?{{ .cur_ver }}"></script>
<script src="{{ .base_path }}assets/persian-datepicker/persian-datepicker.min.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/persian-datepicker/persian-datepicker.min.js?{{ .cur_ver }}"></script>

View file

@ -18,18 +18,10 @@
</a-list-item> </a-list-item>
{{end}} {{end}}
{{define "component/setting"}} {{define "component/aSettingListItem"}}
<script> <script>
Vue.component('a-setting-list-item', { Vue.component('a-setting-list-item', {
props: { props: {
'title': {
type: String,
required: true,
},
'description': {
type: String,
required: false,
},
'paddings': { 'paddings': {
type: String, type: String,
required: false, required: false,

View file

@ -3,7 +3,7 @@
@click="clickHandler" /> @click="clickHandler" />
{{end}} {{end}}
{{define "component/sortableTable"}} {{define "component/aTableSortable"}}
<script> <script>
const DRAGGABLE_ROW_CLASS = 'draggable-row'; const DRAGGABLE_ROW_CLASS = 'draggable-row';
const findParentRowElement = (el) => { const findParentRowElement = (el) => {

View file

@ -4,15 +4,15 @@
<a-sub-menu> <a-sub-menu>
<span slot="title"> <span slot="title">
<a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon> <a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon>
<span>Theme</span> <span>{{ i18n "menu.theme" }}</span>
</span> </span>
<a-menu-item id="change-theme" class="ant-menu-theme-switch" @mousedown="themeSwitcher.animationsOff()"> Dark <a-menu-item id="change-theme" class="ant-menu-theme-switch" @mousedown="themeSwitcher.animationsOff()">
<a-switch style="margin-left: 2px;" size="small" :default-checked="themeSwitcher.isDarkTheme" <span>{{ i18n "menu.dark" }}</span>
@change="themeSwitcher.toggleTheme()"></a-switch> <a-switch style="margin-left: 2px;" size="small" :default-checked="themeSwitcher.isDarkTheme" @change="themeSwitcher.toggleTheme()"></a-switch>
</a-menu-item> </a-menu-item>
<a-menu-item id="change-theme-ultra" v-if="themeSwitcher.isDarkTheme" class="ant-menu-theme-switch" <a-menu-item id="change-theme-ultra" v-if="themeSwitcher.isDarkTheme" class="ant-menu-theme-switch" @mousedown="themeSwitcher.animationsOffUltra()">
@mousedown="themeSwitcher.animationsOffUltra()"> Ultra <a-checkbox style="margin-left: 2px;" <span>{{ i18n "menu.ultraDark" }}</span>
:checked="themeSwitcher.isUltra" @click="themeSwitcher.toggleUltra()"></a-checkbox> <a-checkbox style="margin-left: 2px;" :checked="themeSwitcher.isUltra" @click="themeSwitcher.toggleUltra()"></a-checkbox>
</a-menu-item> </a-menu-item>
</a-sub-menu> </a-sub-menu>
</a-menu> </a-menu>
@ -36,7 +36,7 @@
</template> </template>
{{end}} {{end}}
{{define "component/themeSwitcher"}} {{define "component/aThemeSwitch"}}
<script> <script>
function createThemeSwitcher() { function createThemeSwitcher() {
const isDarkTheme = localStorage.getItem('dark-mode') === 'true'; const isDarkTheme = localStorage.getItem('dark-mode') === 'true';

View file

@ -548,8 +548,8 @@
<script src="{{ .base_path }}assets/uri/URI.min.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/uri/URI.min.js?{{ .cur_ver }}"></script>
<script src="{{ .base_path }}assets/js/model/inbound.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/js/model/inbound.js?{{ .cur_ver }}"></script>
<script src="{{ .base_path }}assets/js/model/dbinbound.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/js/model/dbinbound.js?{{ .cur_ver }}"></script>
{{template "component/themeSwitcher" .}} {{template "component/aThemeSwitch" .}}
{{template "component/persianDatepicker" .}} {{template "component/aPersianDatepicker" .}}
<script> <script>
const columns = [{ const columns = [{
title: "ID", title: "ID",

View file

@ -27,8 +27,6 @@
.dark .ant-backup-list-item svg, .dark .ant-backup-list-item svg,
.dark .ant-card-actions>li>*, .dark .ant-card-actions>li>*,
.dark .ant-badge-status-text, .dark .ant-badge-status-text,
.dark .ant-statistic-title,
.dark .ant-statistic-content,
.dark .ant-card-extra { .dark .ant-card-extra {
color: var(--dark-color-text-primary) !important; color: var(--dark-color-text-primary) !important;
} }
@ -44,12 +42,6 @@
.ant-card-actions { .ant-card-actions {
background: transparent !important; background: transparent !important;
} }
.ant-statistic-content-prefix {
font-size: 20px;
}
.ant-statistic-content-value {
font-size: 18px;
}
.ip-hidden { .ip-hidden {
filter: blur(10px); filter: blur(10px);
} }
@ -123,14 +115,22 @@
</transition> </transition>
<transition name="list" appear> <transition name="list" appear>
<template v-if="!status.isLoaded"> <template v-if="!status.isLoaded">
<a-card hoverable style="text-align: center; padding: 30px 0; margin-top: 10px;"> <div style="text-align: center; padding: 30px 0; margin-top: 10px;">
<a-spin size="large"></a-spin> <a-spin size="large"></a-spin>
</a-card> </div>
</template> </template>
<template v-else> <template v-else>
<a-row> <a-row>
<a-col :sm="24" :lg="12"> <a-col :sm="24" :lg="12">
<a-card title='{{ i18n "pages.index.xrayStatus" }}' hoverable> <a-card hoverable>
<template #title>
<a-space direction="horizontal">
<span>{{ i18n "pages.index.xrayStatus" }}</span>
<a-tag v-if="isMobile && status.xray.version != 'Unknown'" color="green">
v[[ status.xray.version ]]
</a-tag>
</a-space>
</template>
<template #extra> <template #extra>
<template v-if="status.xray.state != State.Error"> <template v-if="status.xray.state != State.Error">
<a-badge :text="status.xray.state" :color="status.xray.color" style="text-transform: capitalize;"/> <a-badge :text="status.xray.state" :color="status.xray.color" style="text-transform: capitalize;"/>
@ -150,15 +150,17 @@
<template #actions> <template #actions>
<a-space direction="horizontal" @click="stopXrayService" style="justify-content: center;"> <a-space direction="horizontal" @click="stopXrayService" style="justify-content: center;">
<a-icon type="poweroff"></a-icon> <a-icon type="poweroff"></a-icon>
<span>{{ i18n "pages.index.stopXray" }}</span> <span v-if="!isMobile">{{ i18n "pages.index.stopXray" }}</span>
</a-space> </a-space>
<a-space direction="horizontal" @click="restartXrayService" style="justify-content: center;"> <a-space direction="horizontal" @click="restartXrayService" style="justify-content: center;">
<a-icon type="reload"></a-icon> <a-icon type="reload"></a-icon>
<span>{{ i18n "pages.index.restartXray" }}</span> <span v-if="!isMobile">{{ i18n "pages.index.restartXray" }}</span>
</a-space> </a-space>
<a-space direction="horizontal" @click="openSelectV2rayVersion" style="justify-content: center;"> <a-space direction="horizontal" @click="openSelectV2rayVersion" style="justify-content: center;">
<a-icon type="tool"></a-icon> <a-icon type="tool"></a-icon>
<span>v[[ status.xray.version ]]</span> <span v-if="!isMobile">
[[ status.xray.version != 'Unknown' ? `v${status.xray.version}` : '{{ i18n "pages.index.xraySwitch" }}' ]]
</span>
</a-space> </a-space>
</template> </template>
</a-card> </a-card>
@ -168,15 +170,15 @@
<template #actions> <template #actions>
<a-space direction="horizontal" @click="openLogs()" style="justify-content: center;"> <a-space direction="horizontal" @click="openLogs()" style="justify-content: center;">
<a-icon type="bars"></a-icon> <a-icon type="bars"></a-icon>
<span>{{ i18n "pages.index.logs" }}</span> <span v-if="!isMobile">{{ i18n "pages.index.logs" }}</span>
</a-space> </a-space>
<a-space direction="horizontal" @click="openConfig" style="justify-content: center;"> <a-space direction="horizontal" @click="openConfig" style="justify-content: center;">
<a-icon type="control"></a-icon> <a-icon type="control"></a-icon>
<span>{{ i18n "pages.index.config" }}</span> <span v-if="!isMobile">{{ i18n "pages.index.config" }}</span>
</a-space> </a-space>
<a-space direction="horizontal" @click="openBackup" style="justify-content: center;"> <a-space direction="horizontal" @click="openBackup" style="justify-content: center;">
<a-icon type="cloud-server"></a-icon> <a-icon type="cloud-server"></a-icon>
<span>{{ i18n "pages.index.backup" }}</span> <span v-if="!isMobile">{{ i18n "pages.index.backup" }}</span>
</a-space> </a-space>
</template> </template>
</a-card> </a-card>
@ -223,18 +225,18 @@
</template> </template>
<a-row :class="showIp ? 'ip-visible' : 'ip-hidden'"> <a-row :class="showIp ? 'ip-visible' : 'ip-hidden'">
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title="IPv4" :value="status.publicIP.ipv4"> <a-custom-statistic title="IPv4" :value="status.publicIP.ipv4">
<template #prefix> <template #prefix>
<a-icon type="global" /> <a-icon type="global" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title="IPv6" :value="status.publicIP.ipv6"> <a-custom-statistic title="IPv6" :value="status.publicIP.ipv6">
<template #prefix> <template #prefix>
<a-icon type="global" /> <a-icon type="global" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
@ -243,18 +245,18 @@
<a-card title='{{ i18n "pages.index.connectionCount" }}' hoverable> <a-card title='{{ i18n "pages.index.connectionCount" }}' hoverable>
<a-row> <a-row>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title="TCP" :value="status.tcpCount"> <a-custom-statistic title="TCP" :value="status.tcpCount">
<template #prefix> <template #prefix>
<a-icon type="swap" /> <a-icon type="swap" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title="UDP" :value="status.udpCount"> <a-custom-statistic title="UDP" :value="status.udpCount">
<template #prefix> <template #prefix>
<a-icon type="swap" /> <a-icon type="swap" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
@ -263,24 +265,24 @@
<a-card title='{{ i18n "pages.index.overallSpeed" }}' hoverable> <a-card title='{{ i18n "pages.index.overallSpeed" }}' hoverable>
<a-row> <a-row>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title='{{ i18n "pages.index.upload" }}' :value="SizeFormatter.sizeFormat(status.netIO.up)"> <a-custom-statistic title='{{ i18n "pages.index.upload" }}' :value="SizeFormatter.sizeFormat(status.netIO.up)">
<template #prefix> <template #prefix>
<a-icon type="arrow-up" /> <a-icon type="arrow-up" />
</template> </template>
<template #suffix> <template #suffix>
/s /s
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title='{{ i18n "pages.index.download" }}' :value="SizeFormatter.sizeFormat(status.netIO.down)"> <a-custom-statistic title='{{ i18n "pages.index.download" }}' :value="SizeFormatter.sizeFormat(status.netIO.down)">
<template #prefix> <template #prefix>
<a-icon type="arrow-down" /> <a-icon type="arrow-down" />
</template> </template>
<template #suffix> <template #suffix>
/s /s
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
@ -289,18 +291,18 @@
<a-card title='{{ i18n "pages.index.totalData" }}' hoverable> <a-card title='{{ i18n "pages.index.totalData" }}' hoverable>
<a-row> <a-row>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title='{{ i18n "pages.index.sent" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.sent)"> <a-custom-statistic title='{{ i18n "pages.index.sent" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.sent)">
<template #prefix> <template #prefix>
<a-icon type="cloud-upload" /> <a-icon type="cloud-upload" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
<a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }"> <a-col :lg="12" :sm="24" :style="{ marginTop: isMobile ? '10px' : 0 }">
<a-statistic title='{{ i18n "pages.index.received" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.recv)"> <a-custom-statistic title='{{ i18n "pages.index.received" }}' :value="SizeFormatter.sizeFormat(status.netTraffic.recv)">
<template #prefix> <template #prefix>
<a-icon type="cloud-download" /> <a-icon type="cloud-download" />
</template> </template>
</a-statistic> </a-custom-statistic>
</a-col> </a-col>
</a-row> </a-row>
</a-card> </a-card>
@ -397,7 +399,8 @@
</a-modal> </a-modal>
</a-layout> </a-layout>
{{template "js" .}} {{template "js" .}}
{{template "component/themeSwitcher" .}} {{template "component/aThemeSwitch" .}}
{{template "component/aCustomStatistic" .}}
{{template "textModal"}} {{template "textModal"}}
<script> <script>
const State = { const State = {

View file

@ -663,9 +663,9 @@
</a-layout> </a-layout>
{{template "js" .}} {{template "js" .}}
<script src="{{ .base_path }}assets/js/model/setting.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/js/model/setting.js?{{ .cur_ver }}"></script>
{{template "component/themeSwitcher" .}} {{template "component/aThemeSwitch" .}}
{{template "component/password" .}} {{template "component/aPasswordInput" .}}
{{template "component/setting"}} {{template "component/aSettingListItem" .}}
<script> <script>
const app = new Vue({ const app = new Vue({
delimiters: ['[[', ']]'], delimiters: ['[[', ']]'],

View file

@ -788,9 +788,9 @@
</a-layout> </a-layout>
</a-layout> </a-layout>
{{template "js" .}} {{template "js" .}}
{{template "component/themeSwitcher" .}} {{template "component/aThemeSwitch" .}}
{{template "component/sortableTable" .}} {{template "component/aTableSortable" .}}
{{template "component/setting"}} {{template "component/aSettingListItem" .}}
{{template "ruleModal"}} {{template "ruleModal"}}
{{template "outModal"}} {{template "outModal"}}
{{template "reverseModal"}} {{template "reverseModal"}}

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "No added reverse proxies." "emptyReverseDesc" = "No added reverse proxies."
[menu] [menu]
"theme" = "Theme"
"dark" = "Dark"
"ultraDark" = "Ultra Dark"
"dashboard" = "Overview" "dashboard" = "Overview"
"inbounds" = "Inbounds" "inbounds" = "Inbounds"
"settings" = "Panel Settings" "settings" = "Panel Settings"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "No hay proxies inversos añadidos." "emptyReverseDesc" = "No hay proxies inversos añadidos."
[menu] [menu]
"theme" = "Tema"
"dark" = "Oscuro"
"ultraDark" = "Ultra Oscuro"
"dashboard" = "Estado del Sistema" "dashboard" = "Estado del Sistema"
"inbounds" = "Entradas" "inbounds" = "Entradas"
"settings" = "Configuraciones" "settings" = "Configuraciones"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "هیچ پروکسی معکوس اضافه نشده است." "emptyReverseDesc" = "هیچ پروکسی معکوس اضافه نشده است."
[menu] [menu]
"theme" = "تم"
"dark" = "تیره"
"ultraDark" = "فوق تیره"
"dashboard" = "نمای کلی" "dashboard" = "نمای کلی"
"inbounds" = "ورودی‌ها" "inbounds" = "ورودی‌ها"
"settings" = "تنظیمات پنل" "settings" = "تنظیمات پنل"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Tidak ada proxy terbalik yang ditambahkan." "emptyReverseDesc" = "Tidak ada proxy terbalik yang ditambahkan."
[menu] [menu]
"theme" = "Tema"
"dark" = "Gelap"
"ultraDark" = "Sangat Gelap"
"dashboard" = "Ikhtisar" "dashboard" = "Ikhtisar"
"inbounds" = "Masuk" "inbounds" = "Masuk"
"settings" = "Pengaturan Panel" "settings" = "Pengaturan Panel"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "追加されたリバースプロキシはありません。" "emptyReverseDesc" = "追加されたリバースプロキシはありません。"
[menu] [menu]
"theme" = "テーマ"
"dark" = "ダーク"
"ultraDark" = "ウルトラダーク"
"dashboard" = "ダッシュボード" "dashboard" = "ダッシュボード"
"inbounds" = "インバウンド一覧" "inbounds" = "インバウンド一覧"
"settings" = "パネル設定" "settings" = "パネル設定"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Nenhum proxy reverso adicionado." "emptyReverseDesc" = "Nenhum proxy reverso adicionado."
[menu] [menu]
"theme" = "Tema"
"dark" = "Escuro"
"ultraDark" = "Ultra Escuro"
"dashboard" = "Visão Geral" "dashboard" = "Visão Geral"
"inbounds" = "Inbounds" "inbounds" = "Inbounds"
"settings" = "Panel Settings" "settings" = "Panel Settings"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Нет добавленных обратных прокси." "emptyReverseDesc" = "Нет добавленных обратных прокси."
[menu] [menu]
"theme" = "Тема"
"dark" = "Темная"
"ultraDark" = "Ультра темная"
"dashboard" = "Статус системы" "dashboard" = "Статус системы"
"inbounds" = "Подключения" "inbounds" = "Подключения"
"settings" = "Настройки панели" "settings" = "Настройки панели"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Eklenmiş ters proxy yok." "emptyReverseDesc" = "Eklenmiş ters proxy yok."
[menu] [menu]
"theme" = "Tema"
"dark" = "Koyu"
"ultraDark" = "Ultra Koyu"
"dashboard" = "Genel Bakış" "dashboard" = "Genel Bakış"
"inbounds" = "Gelenler" "inbounds" = "Gelenler"
"settings" = "Panel Ayarları" "settings" = "Panel Ayarları"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Немає доданих зворотних проксі." "emptyReverseDesc" = "Немає доданих зворотних проксі."
[menu] [menu]
"theme" = "Тема"
"dark" = "Темна"
"ultraDark" = "Ультра темна"
"dashboard" = "Огляд" "dashboard" = "Огляд"
"inbounds" = "Вхідні" "inbounds" = "Вхідні"
"settings" = "Параметри панелі" "settings" = "Параметри панелі"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "Không có proxy ngược nào được thêm." "emptyReverseDesc" = "Không có proxy ngược nào được thêm."
[menu] [menu]
"theme" = "Chủ đề"
"dark" = "Tối"
"ultraDark" = "Siêu tối"
"dashboard" = "Trạng thái hệ thống" "dashboard" = "Trạng thái hệ thống"
"inbounds" = "Đầu vào khách hàng" "inbounds" = "Đầu vào khách hàng"
"settings" = "Cài đặt bảng điều khiển" "settings" = "Cài đặt bảng điều khiển"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "未添加反向代理。" "emptyReverseDesc" = "未添加反向代理。"
[menu] [menu]
"theme" = "主题"
"dark" = "暗色"
"ultraDark" = "超暗色"
"dashboard" = "系统状态" "dashboard" = "系统状态"
"inbounds" = "入站列表" "inbounds" = "入站列表"
"settings" = "面板设置" "settings" = "面板设置"

View file

@ -67,6 +67,9 @@
"emptyReverseDesc" = "未添加反向代理。" "emptyReverseDesc" = "未添加反向代理。"
[menu] [menu]
"theme" = "主題"
"dark" = "深色"
"ultraDark" = "超深色"
"dashboard" = "系統狀態" "dashboard" = "系統狀態"
"inbounds" = "入站列表" "inbounds" = "入站列表"
"settings" = "面板設定" "settings" = "面板設定"