separate xray page #1286

This commit is contained in:
Alireza Ahmadi 2023-12-04 19:20:46 +01:00
parent a8b7063647
commit 2a8da2ba3c
12 changed files with 211 additions and 84 deletions

View file

@ -41,7 +41,7 @@ func (a *SettingController) initRouter(g *gin.RouterGroup) {
g.POST("/update", a.updateSetting) g.POST("/update", a.updateSetting)
g.POST("/updateUser", a.updateUser) g.POST("/updateUser", a.updateUser)
g.POST("/restartPanel", a.restartPanel) g.POST("/restartPanel", a.restartPanel)
g.GET("/getDefaultJsonConfig", a.getDefaultJsonConfig) g.GET("/getDefaultJsonConfig", a.getDefaultXrayConfig)
g.POST("/updateUserSecret", a.updateSecret) g.POST("/updateUserSecret", a.updateSecret)
g.POST("/getUserSecret", a.getUserSecret) g.POST("/getUserSecret", a.getUserSecret)
} }
@ -55,15 +55,6 @@ func (a *SettingController) getAllSetting(c *gin.Context) {
jsonObj(c, allSetting, nil) jsonObj(c, allSetting, nil)
} }
func (a *SettingController) getDefaultJsonConfig(c *gin.Context) {
defaultJsonConfig, err := a.settingService.GetDefaultJsonConfig()
if err != nil {
jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
return
}
jsonObj(c, defaultJsonConfig, nil)
}
func (a *SettingController) getDefaultSettings(c *gin.Context) { func (a *SettingController) getDefaultSettings(c *gin.Context) {
type settingFunc func() (interface{}, error) type settingFunc func() (interface{}, error)
@ -169,3 +160,12 @@ func (a *SettingController) getUserSecret(c *gin.Context) {
jsonObj(c, user, nil) jsonObj(c, user, nil)
} }
} }
func (a *SettingController) getDefaultXrayConfig(c *gin.Context) {
defaultJsonConfig, err := a.settingService.GetDefaultXrayConfig()
if err != nil {
jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
return
}
jsonObj(c, defaultJsonConfig, nil)
}

View file

@ -0,0 +1,50 @@
package controller
import (
"x-ui/web/service"
"github.com/gin-gonic/gin"
)
type XraySettingController struct {
XraySettingService service.XraySettingService
SettingService service.SettingService
}
func NewXraySettingController(g *gin.RouterGroup) *XraySettingController {
a := &XraySettingController{}
a.initRouter(g)
return a
}
func (a *XraySettingController) initRouter(g *gin.RouterGroup) {
g = g.Group("/xray")
g.POST("/", a.getXraySetting)
g.POST("/update", a.updateSetting)
g.GET("/getDefaultJsonConfig", a.getDefaultXrayConfig)
}
func (a *XraySettingController) getXraySetting(c *gin.Context) {
xraySetting, err := a.SettingService.GetXrayConfigTemplate()
if err != nil {
jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
return
}
jsonObj(c, xraySetting, nil)
}
func (a *XraySettingController) updateSetting(c *gin.Context) {
xraySetting := c.PostForm("xraySetting")
err := a.XraySettingService.SaveXraySetting(xraySetting)
jsonMsg(c, I18nWeb(c, "pages.settings.toasts.modifySettings"), err)
}
func (a *XraySettingController) getDefaultXrayConfig(c *gin.Context) {
defaultJsonConfig, err := a.SettingService.GetDefaultXrayConfig()
if err != nil {
jsonMsg(c, I18nWeb(c, "pages.settings.toasts.getSettings"), err)
return
}
jsonObj(c, defaultJsonConfig, nil)
}

View file

@ -9,6 +9,7 @@ type XUIController struct {
inboundController *InboundController inboundController *InboundController
settingController *SettingController settingController *SettingController
xraySettingController *XraySettingController
} }
func NewXUIController(g *gin.RouterGroup) *XUIController { func NewXUIController(g *gin.RouterGroup) *XUIController {
@ -24,9 +25,11 @@ func (a *XUIController) initRouter(g *gin.RouterGroup) {
g.GET("/", a.index) g.GET("/", a.index)
g.GET("/inbounds", a.inbounds) g.GET("/inbounds", a.inbounds)
g.GET("/settings", a.settings) g.GET("/settings", a.settings)
g.GET("/xray", a.xraySettings)
a.inboundController = NewInboundController(g) a.inboundController = NewInboundController(g)
a.settingController = NewSettingController(g) a.settingController = NewSettingController(g)
a.xraySettingController = NewXraySettingController(g)
} }
func (a *XUIController) index(c *gin.Context) { func (a *XUIController) index(c *gin.Context) {
@ -40,3 +43,7 @@ func (a *XUIController) inbounds(c *gin.Context) {
func (a *XUIController) settings(c *gin.Context) { func (a *XUIController) settings(c *gin.Context) {
html(c, "settings.html", "pages.settings.title", nil) html(c, "settings.html", "pages.settings.title", nil)
} }
func (a *XUIController) xraySettings(c *gin.Context) {
html(c, "xray.html", "pages.xray.title", nil)
}

View file

@ -2,12 +2,10 @@ package entity
import ( import (
"crypto/tls" "crypto/tls"
"encoding/json"
"net" "net"
"strings" "strings"
"time" "time"
"x-ui/util/common" "x-ui/util/common"
"x-ui/xray"
) )
type Msg struct { type Msg struct {
@ -44,7 +42,6 @@ type AllSetting struct {
TgBotLoginNotify bool `json:"tgBotLoginNotify" form:"tgBotLoginNotify"` TgBotLoginNotify bool `json:"tgBotLoginNotify" form:"tgBotLoginNotify"`
TgCpu int `json:"tgCpu" form:"tgCpu"` TgCpu int `json:"tgCpu" form:"tgCpu"`
TgLang string `json:"tgLang" form:"tgLang"` TgLang string `json:"tgLang" form:"tgLang"`
XrayTemplateConfig string `json:"xrayTemplateConfig" form:"xrayTemplateConfig"`
TimeLocation string `json:"timeLocation" form:"timeLocation"` TimeLocation string `json:"timeLocation" form:"timeLocation"`
SecretEnable bool `json:"secretEnable" form:"secretEnable"` SecretEnable bool `json:"secretEnable" form:"secretEnable"`
SubEnable bool `json:"subEnable" form:"subEnable"` SubEnable bool `json:"subEnable" form:"subEnable"`
@ -107,13 +104,7 @@ func (s *AllSetting) CheckValid() error {
s.WebBasePath += "/" s.WebBasePath += "/"
} }
xrayConfig := &xray.Config{} _, err := time.LoadLocation(s.TimeLocation)
err := json.Unmarshal([]byte(s.XrayTemplateConfig), xrayConfig)
if err != nil {
return common.NewError("xray template config invalid:", err)
}
_, err = time.LoadLocation(s.TimeLocation)
if err != nil { if err != nil {
return common.NewError("time location not exist:", s.TimeLocation) return common.NewError("time location not exist:", s.TimeLocation)
} }

View file

@ -70,7 +70,7 @@ func (s *SettingService) GetDefaultJsonConfig() (interface{}, error) {
func (s *SettingService) GetAllSetting() (*entity.AllSetting, error) { func (s *SettingService) GetAllSetting() (*entity.AllSetting, error) {
db := database.GetDB() db := database.GetDB()
settings := make([]*model.Setting, 0) settings := make([]*model.Setting, 0)
err := db.Model(model.Setting{}).Find(&settings).Error err := db.Model(model.Setting{}).Not("key = ?", "xrayTemplateConfig").Find(&settings).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -426,3 +426,12 @@ func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error {
} }
return common.Combine(errs...) return common.Combine(errs...)
} }
func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) {
var jsonData interface{}
err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData)
if err != nil {
return nil, err
}
return jsonData, nil
}

View file

@ -0,0 +1,28 @@
package service
import (
_ "embed"
"encoding/json"
"x-ui/util/common"
"x-ui/xray"
)
type XraySettingService struct {
SettingService
}
func (s *XraySettingService) SaveXraySetting(newXraySettings string) error {
if err := s.CheckXrayConfig(newXraySettings); err != nil {
return err
}
return s.SettingService.saveSetting("xrayTemplateConfig", newXraySettings)
}
func (s *XraySettingService) CheckXrayConfig(XrayTemplateConfig string) error {
xrayConfig := &xray.Config{}
err := json.Unmarshal([]byte(XrayTemplateConfig), xrayConfig)
if err != nil {
return common.NewError("xray template config invalid:", err)
}
return nil
}

View file

@ -12,7 +12,7 @@
"protocol" = "Protocol" "protocol" = "Protocol"
"search" = "Search" "search" = "Search"
"filter" = "Filter" "filter" = "Filter"
"loading" = "Loading" "loading" = "Loading..."
"second" = "Second" "second" = "Second"
"minute" = "Minute" "minute" = "Minute"
"hour" = "Hour" "hour" = "Hour"
@ -37,7 +37,9 @@
"enabled" = "Enabled" "enabled" = "Enabled"
"disabled" = "Disabled" "disabled" = "Disabled"
"depleted" = "Depleted" "depleted" = "Depleted"
"depletingSoon" = "Depleting soon" "depletingSoon" = "Depleting"
"offline" = "Offline"
"online" = "Online"
"domainName" = "Domain name" "domainName" = "Domain name"
"monitor" = "Listening IP" "monitor" = "Listening IP"
"certificate" = "Certificate" "certificate" = "Certificate"
@ -54,6 +56,7 @@
"dashboard" = "System Status" "dashboard" = "System Status"
"inbounds" = "Inbounds" "inbounds" = "Inbounds"
"settings" = "Panel Settings" "settings" = "Panel Settings"
"xray" = "Xray Settings"
"logout" = "Logout" "logout" = "Logout"
"link" = "Other" "link" = "Other"
@ -121,6 +124,8 @@
"modifyInbound" = "Modify Inbound" "modifyInbound" = "Modify Inbound"
"deleteInbound" = "Delete Inbound" "deleteInbound" = "Delete Inbound"
"deleteInboundContent" = "Confirm deletion of inbound?" "deleteInboundContent" = "Confirm deletion of inbound?"
"deleteClient" = "Delete Client"
"deleteClientContent" = "Are you sure you want to delete client?"
"resetTrafficContent" = "Confirm traffic reset?" "resetTrafficContent" = "Confirm traffic reset?"
"copyLink" = "Copy Link" "copyLink" = "Copy Link"
"address" = "Address" "address" = "Address"
@ -132,8 +137,8 @@
"totalFlow" = "Total Flow" "totalFlow" = "Total Flow"
"leaveBlankToNeverExpire" = "Leave Blank to Never Expire" "leaveBlankToNeverExpire" = "Leave Blank to Never Expire"
"noRecommendKeepDefault" = "No special requirements to maintain default settings" "noRecommendKeepDefault" = "No special requirements to maintain default settings"
"certificatePath" = "Certificate File Path" "certificatePath" = "File Path"
"certificateContent" = "Certificate File Content" "certificateContent" = "File Content"
"publicKeyPath" = "Public Key Path" "publicKeyPath" = "Public Key Path"
"publicKeyContent" = "Public Key Content" "publicKeyContent" = "Public Key Content"
"keyPath" = "Private Key Path" "keyPath" = "Private Key Path"
@ -169,6 +174,7 @@
"realityDesc" = "Xray core needs to be 1.8.0 or higher." "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 )" "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" "subscriptionDesc" = "you can find your sub link on Details, also you can use the same name for several configurations"
"info" = "Info"
[pages.client] [pages.client]
"add" = "Add Client" "add" = "Add Client"
@ -185,6 +191,8 @@
"delayedStart" = "Start after first use" "delayedStart" = "Start after first use"
"expireDays" = "Expire days" "expireDays" = "Expire days"
"days" = "day(s)" "days" = "day(s)"
"renew" = "Auto renew"
"renewDesc" = "Auto renew days after expiration. 0 = disable"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "Obtain" "obtain" = "Obtain"
@ -216,7 +224,6 @@
"resetDefaultConfig" = "Reset to Default Configuration" "resetDefaultConfig" = "Reset to Default Configuration"
"panelSettings" = "Panel Settings" "panelSettings" = "Panel Settings"
"securitySettings" = "Security Settings" "securitySettings" = "Security Settings"
"xrayConfiguration" = "Xray Configuration"
"TGBotSettings" = "Telegram Bot Settings" "TGBotSettings" = "Telegram Bot Settings"
"panelListeningIP" = "Panel Listening IP" "panelListeningIP" = "Panel Listening IP"
"panelListeningIPDesc" = "Leave blank by default to monitor all IPs." "panelListeningIPDesc" = "Leave blank by default to monitor all IPs."
@ -278,8 +285,8 @@
"subShowInfo" = "Show usage info" "subShowInfo" = "Show usage info"
"subShowInfoDesc" = "Show remianed traffic and date after config name" "subShowInfoDesc" = "Show remianed traffic and date after config name"
[pages.settings.templates] [pages.xray]
"title" = "Templates" "title" = "Xray Settings"
"basicTemplate" = "Basic Template" "basicTemplate" = "Basic Template"
"advancedTemplate" = "Advanced Template" "advancedTemplate" = "Advanced Template"
"completeTemplate" = "Complete Template" "completeTemplate" = "Complete Template"

View file

@ -12,7 +12,7 @@
"protocol" = "Protocolo" "protocol" = "Protocolo"
"search" = "Buscar" "search" = "Buscar"
"filter" = "Filtrar" "filter" = "Filtrar"
"loading" = "Cargando" "loading" = "Cargando..."
"second" = "Segundo" "second" = "Segundo"
"minute" = "Minuto" "minute" = "Minuto"
"hour" = "Hora" "hour" = "Hora"
@ -37,7 +37,9 @@
"enabled" = "Habilitado" "enabled" = "Habilitado"
"disabled" = "Deshabilitado" "disabled" = "Deshabilitado"
"depleted" = "Agotado" "depleted" = "Agotado"
"depletingSoon" = "Agotándose pronto" "depletingSoon" = "Agotándose"
"offline" = "fuera de línea"
"online" = "en línea"
"domainName" = "Nombre de dominio" "domainName" = "Nombre de dominio"
"monitor" = "Listening IP" "monitor" = "Listening IP"
"certificate" = "Certificado" "certificate" = "Certificado"
@ -54,6 +56,7 @@
"dashboard" = "Estado del Sistema" "dashboard" = "Estado del Sistema"
"inbounds" = "Entradas" "inbounds" = "Entradas"
"settings" = "Configuraciones" "settings" = "Configuraciones"
"xray" = "Configuración Xray"
"logout" = "Cerrar Sesión" "logout" = "Cerrar Sesión"
"link" = "Otro" "link" = "Otro"
@ -121,6 +124,8 @@
"modifyInbound" = "Modificar Entrada" "modifyInbound" = "Modificar Entrada"
"deleteInbound" = "Eliminar Entrada" "deleteInbound" = "Eliminar Entrada"
"deleteInboundContent" = "¿Confirmar eliminación de entrada?" "deleteInboundContent" = "¿Confirmar eliminación de entrada?"
"deleteClient" = "Eliminar cliente"
"deleteClientContent" = "¿Está seguro de que desea eliminar el cliente?"
"resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?" "resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?"
"copyLink" = "Copiar Enlace" "copyLink" = "Copiar Enlace"
"address" = "Dirección" "address" = "Dirección"
@ -132,8 +137,8 @@
"totalFlow" = "Flujo Total" "totalFlow" = "Flujo Total"
"leaveBlankToNeverExpire" = "Dejar en Blanco para Nunca Expirar" "leaveBlankToNeverExpire" = "Dejar en Blanco para Nunca Expirar"
"noRecommendKeepDefault" = "No hay requisitos especiales para mantener la configuración predeterminada" "noRecommendKeepDefault" = "No hay requisitos especiales para mantener la configuración predeterminada"
"certificatePath" = "Ruta del Archivo de Certificado" "certificatePath" = "Ruta del Archivo"
"certificateContent" = "Contenido del Archivo de Certificado" "certificateContent" = "Contenido del Archivo"
"publicKeyPath" = "Ruta de la Clave Pública" "publicKeyPath" = "Ruta de la Clave Pública"
"publicKeyContent" = "Contenido de la Clave Pública" "publicKeyContent" = "Contenido de la Clave Pública"
"keyPath" = "Ruta de la Clave Privada" "keyPath" = "Ruta de la Clave Privada"
@ -169,6 +174,7 @@
"realityDesc" = "La versión del núcleo de Xray debe ser 1.8.0 o superior." "realityDesc" = "La versión del núcleo de Xray debe ser 1.8.0 o superior."
"telegramDesc" = "Utiliza el ID de Telegram sin @ o los IDs de chat (puedes obtenerlo aquí @userinfobot o usando el comando '/id' en el bot)." "telegramDesc" = "Utiliza el ID de Telegram sin @ o los IDs de chat (puedes obtenerlo aquí @userinfobot o usando el comando '/id' en el bot)."
"subscriptionDesc" = "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones." "subscriptionDesc" = "Puedes encontrar tu enlace de suscripción en Detalles, también puedes usar el mismo nombre para varias configuraciones."
"info" = "Info"
[pages.client] [pages.client]
"add" = "Agregar Cliente" "add" = "Agregar Cliente"
@ -185,6 +191,8 @@
"delayedStart" = "Iniciar después del primer uso" "delayedStart" = "Iniciar después del primer uso"
"expireDays" = "Días de Expiración" "expireDays" = "Días de Expiración"
"days" = "día(s)" "days" = "día(s)"
"renew" = "Renovación automática"
"renewDesc" = "Renovación automática días después del vencimiento. 0 = deshabilitar"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "Recibir" "obtain" = "Recibir"
@ -216,7 +224,6 @@
"resetDefaultConfig" = "Restablecer a Configuración Predeterminada" "resetDefaultConfig" = "Restablecer a Configuración Predeterminada"
"panelSettings" = "Configuraciones del Panel" "panelSettings" = "Configuraciones del Panel"
"securitySettings" = "Configuraciones de Seguridad" "securitySettings" = "Configuraciones de Seguridad"
"xrayConfiguration" = "Configuración de Xray"
"TGBotSettings" = "Configuraciones de Bot de Telegram" "TGBotSettings" = "Configuraciones de Bot de Telegram"
"panelListeningIP" = "IP de Escucha del Panel" "panelListeningIP" = "IP de Escucha del Panel"
"panelListeningIPDesc" = "Dejar en blanco por defecto para monitorear todas las IPs." "panelListeningIPDesc" = "Dejar en blanco por defecto para monitorear todas las IPs."
@ -278,8 +285,8 @@
"subShowInfo" = "Mostrar información de uso" "subShowInfo" = "Mostrar información de uso"
"subShowInfoDesc" = "Mostrar tráfico restante y fecha después del nombre de configuración." "subShowInfoDesc" = "Mostrar tráfico restante y fecha después del nombre de configuración."
[pages.settings.templates] [pages.xray]
"title" = "Plantillas" "title" = "Xray Configuración"
"basicTemplate" = "Plantilla Básica" "basicTemplate" = "Plantilla Básica"
"advancedTemplate" = "Plantilla Avanzada" "advancedTemplate" = "Plantilla Avanzada"
"completeTemplate" = "Plantilla Completa" "completeTemplate" = "Plantilla Completa"

View file

@ -38,6 +38,8 @@
"disabled" = "غیرفعال" "disabled" = "غیرفعال"
"depleted" = "منقضی" "depleted" = "منقضی"
"depletingSoon" = "در حال انقضا" "depletingSoon" = "در حال انقضا"
"offline" = "آفلاین"
"online" = "آنلاین"
"domainName" = "آدرس دامنه" "domainName" = "آدرس دامنه"
"monitor" = "آی پی اتصال" "monitor" = "آی پی اتصال"
"certificate" = "گواهی دیجیتال" "certificate" = "گواهی دیجیتال"
@ -54,6 +56,7 @@
"dashboard" = "وضعیت سیستم" "dashboard" = "وضعیت سیستم"
"inbounds" = "سرویس ها" "inbounds" = "سرویس ها"
"settings" = "تنظیمات پنل" "settings" = "تنظیمات پنل"
"xray" = "الگوی ایکس‌ری"
"logout" = "خروج" "logout" = "خروج"
"link" = "دیگر" "link" = "دیگر"
@ -121,6 +124,8 @@
"modifyInbound" = "ویرایش سرویس" "modifyInbound" = "ویرایش سرویس"
"deleteInbound" = "حذف سرویس" "deleteInbound" = "حذف سرویس"
"deleteInboundContent" = "آیا مطمئن به حذف سرویس هستید ؟" "deleteInboundContent" = "آیا مطمئن به حذف سرویس هستید ؟"
"deleteClient" = "حذف کاربر"
"deleteClientContent" = "آیا مطمئن به حذف کاربر هستید ؟"
"resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید ؟" "resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید ؟"
"copyLink" = "کپی لینک" "copyLink" = "کپی لینک"
"address" = "آدرس" "address" = "آدرس"
@ -169,6 +174,7 @@
"realityDesc" = "هسته Xray باید 1.8.0 و بالاتر باشد" "realityDesc" = "هسته Xray باید 1.8.0 و بالاتر باشد"
"telegramDesc" = "از آیدی تلگرام بدون @ یا آیدی چت استفاده کنید (می توانید آن را از اینجا دریافت کنید @userinfobot یا در ربات دستور '/id' را وارد کنید)" "telegramDesc" = "از آیدی تلگرام بدون @ یا آیدی چت استفاده کنید (می توانید آن را از اینجا دریافت کنید @userinfobot یا در ربات دستور '/id' را وارد کنید)"
"subscriptionDesc" = "می توانید ساب لینک خود را در جزئیات پیدا کنید، همچنین می توانید از همین نام برای چندین کانفیگ استفاده کنید" "subscriptionDesc" = "می توانید ساب لینک خود را در جزئیات پیدا کنید، همچنین می توانید از همین نام برای چندین کانفیگ استفاده کنید"
"info" = "اطلاعات"
[pages.client] [pages.client]
"add" = "کاربر جدید" "add" = "کاربر جدید"
@ -185,6 +191,8 @@
"delayedStart" = "شروع بعد از اولین استفاده" "delayedStart" = "شروع بعد از اولین استفاده"
"expireDays" = "روزهای اعتبار" "expireDays" = "روزهای اعتبار"
"days" = "(روز)" "days" = "(روز)"
"renew" = "تمدید خودکار"
"renewDesc" = "روزهای تمدید خودکار پس از انقضا. 0 = غیرفعال"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "Obtain" "obtain" = "Obtain"
@ -216,7 +224,6 @@
"resetDefaultConfig" = "برگشت به تنظیمات پیشفرض" "resetDefaultConfig" = "برگشت به تنظیمات پیشفرض"
"panelSettings" = "تنظیمات پنل" "panelSettings" = "تنظیمات پنل"
"securitySettings" = "تنظیمات امنیتی" "securitySettings" = "تنظیمات امنیتی"
"xrayConfiguration" = "تنظیمات Xray"
"TGBotSettings" = "تنظیمات ربات تلگرام" "TGBotSettings" = "تنظیمات ربات تلگرام"
"panelListeningIP" = "محدودیت آی پی پنل" "panelListeningIP" = "محدودیت آی پی پنل"
"panelListeningIPDesc" = "برای استفاده از تمام آی‌پیها به طور پیش فرض خالی بگذارید" "panelListeningIPDesc" = "برای استفاده از تمام آی‌پیها به طور پیش فرض خالی بگذارید"

View file

@ -12,7 +12,7 @@
"protocol" = "Протокол" "protocol" = "Протокол"
"search" = "Поиск" "search" = "Поиск"
"filter" = "Фильтр" "filter" = "Фильтр"
"loading" = "Загрузка" "loading" = "Загрузка..."
"second" = "Секунда" "second" = "Секунда"
"minute" = "Минута" "minute" = "Минута"
"hour" = "Час" "hour" = "Час"
@ -38,6 +38,8 @@
"disabled" = "Отключено" "disabled" = "Отключено"
"depleted" = "Исчерпано" "depleted" = "Исчерпано"
"depletingSoon" = "Почти исчерпано" "depletingSoon" = "Почти исчерпано"
"offline" = "Офлайн"
"online" = "Онлайн"
"domainName" = "Домен" "domainName" = "Домен"
"monitor" = "Порт IP" "monitor" = "Порт IP"
"certificate" = "Сертификат" "certificate" = "Сертификат"
@ -54,6 +56,7 @@
"dashboard" = "Статус системы" "dashboard" = "Статус системы"
"inbounds" = "Подключения" "inbounds" = "Подключения"
"settings" = "Настройки панели" "settings" = "Настройки панели"
"xray" = "Xray Настройки"
"logout" = "Выход" "logout" = "Выход"
"link" = "Прочее" "link" = "Прочее"
@ -132,8 +135,8 @@
"totalFlow" = "Общий расход" "totalFlow" = "Общий расход"
"leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало" "leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало"
"noRecommendKeepDefault" = "Нет требований для сохранения настроек по умолчанию" "noRecommendKeepDefault" = "Нет требований для сохранения настроек по умолчанию"
"certificatePath" = "Путь файла сертификата" "certificatePath" = "Путь файла"
"certificateContent" = "Содержимое файла сертификата" "certificateContent" = "Содержимое файла"
"publicKeyPath" = "Путь к публичному ключу" "publicKeyPath" = "Путь к публичному ключу"
"publicKeyContent" = "Содержимое публичного ключа" "publicKeyContent" = "Содержимое публичного ключа"
"keyPath" = "Путь к приватному ключу" "keyPath" = "Путь к приватному ключу"
@ -169,6 +172,7 @@
"realityDesc" = "Версия Xray должна быть не ниже 1.8.0" "realityDesc" = "Версия Xray должна быть не ниже 1.8.0"
"telegramDesc" = "Используйте идентификатор Telegram без символа @ или идентификатора чата (можно получить его здесь @userinfobot или использовать команду '/id' в боте)" "telegramDesc" = "Используйте идентификатор Telegram без символа @ или идентификатора чата (можно получить его здесь @userinfobot или использовать команду '/id' в боте)"
"subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций" "subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций"
"info" = "Информация"
[pages.client] [pages.client]
"add" = "Добавить пользователя" "add" = "Добавить пользователя"
@ -185,6 +189,8 @@
"delayedStart" = "Начать с момента первого подключения" "delayedStart" = "Начать с момента первого подключения"
"expireDays" = "Срок действия" "expireDays" = "Срок действия"
"days" = "дней" "days" = "дней"
"renew" = "Автопродление"
"renewDesc" = "Автоматическое продление через несколько дней после истечения срока действия. 0 = отключить"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "Получить" "obtain" = "Получить"
@ -278,8 +284,8 @@
"subShowInfo" = "Показать информацию об использовании" "subShowInfo" = "Показать информацию об использовании"
"subShowInfoDesc" = "Показывать восстановленный трафик и дату после имени конфигурации" "subShowInfoDesc" = "Показывать восстановленный трафик и дату после имени конфигурации"
[pages.settings.templates] [pages.xray]
"title" = "Шаблоны" "title" = "Xray Настройки"
"basicTemplate" = "Базовый шаблон" "basicTemplate" = "Базовый шаблон"
"advancedTemplate" = "Расширенный шаблон" "advancedTemplate" = "Расширенный шаблон"
"completeTemplate" = "Полный шаблон" "completeTemplate" = "Полный шаблон"

View file

@ -1,6 +1,6 @@
"username" = "Tên người dùng" "username" = "Tên người dùng"
"password" = "Mật khẩu" "password" = "Mật khẩu"
"login" = "Đăng nhập" "login" = "Đăng nhập..."
"confirm" = "Xác nhận" "confirm" = "Xác nhận"
"cancel" = "Hủy bỏ" "cancel" = "Hủy bỏ"
"close" = "Đóng" "close" = "Đóng"
@ -37,7 +37,9 @@
"enabled" = "Đã kích hoạt" "enabled" = "Đã kích hoạt"
"disabled" = "Đã tắt" "disabled" = "Đã tắt"
"depleted" = "Đã cạn kiệt" "depleted" = "Đã cạn kiệt"
"depletingSoon" = "Sắp cạn kiệt" "depletingSoon" = "Đang cạn kiệt"
"offline" = "Ngoại tuyến"
"online" = "Ngoại tuyến"
"domainName" = "Tên miền" "domainName" = "Tên miền"
"monitor" = "Listening IP" "monitor" = "Listening IP"
"certificate" = "Chứng chỉ" "certificate" = "Chứng chỉ"
@ -55,6 +57,7 @@
"inbounds" = "Inbounds" "inbounds" = "Inbounds"
"settings" = "Cài đặt bảng điều khiển" "settings" = "Cài đặt bảng điều khiển"
"logout" = "Đăng xuất" "logout" = "Đăng xuất"
"xray" = "Xray Cài đặt"
"link" = "Khác" "link" = "Khác"
[pages.login] [pages.login]
@ -121,6 +124,8 @@
"modifyInbound" = "Chỉnh sửa điểm vào (Inbound)" "modifyInbound" = "Chỉnh sửa điểm vào (Inbound)"
"deleteInbound" = "Xóa điểm vào (Inbound)" "deleteInbound" = "Xóa điểm vào (Inbound)"
"deleteInboundContent" = "Xác nhận xóa điểm vào? (Inbound)" "deleteInboundContent" = "Xác nhận xóa điểm vào? (Inbound)"
"deleteClient" = "Xóa khách hàng"
"deleteClientContent" = "Bạn có chắc chắn muốn xóa ứng dụng khách không?"
"resetTrafficContent" = "Xác nhận đặt lại lưu lượng?" "resetTrafficContent" = "Xác nhận đặt lại lưu lượng?"
"copyLink" = "Sao chép liên kết" "copyLink" = "Sao chép liên kết"
"address" = "Địa chỉ" "address" = "Địa chỉ"
@ -132,8 +137,8 @@
"totalFlow" = "Tổng lưu lượng" "totalFlow" = "Tổng lưu lượng"
"leaveBlankToNeverExpire" = "Để trống để không bao giờ hết hạn" "leaveBlankToNeverExpire" = "Để trống để không bao giờ hết hạn"
"noRecommendKeepDefault" = "Không yêu cầu đặc biệt để giữ nguyên cài đặt mặc định" "noRecommendKeepDefault" = "Không yêu cầu đặc biệt để giữ nguyên cài đặt mặc định"
"certificatePath" = "Đường dẫn tập tin chứng chỉ" "certificatePath" = "Đường dẫn tập"
"certificateContent" = "Nội dung tập tin chứng chỉ" "certificateContent" = "Nội dung tập"
"publicKeyPath" = "Đường dẫn khóa công khai" "publicKeyPath" = "Đường dẫn khóa công khai"
"publicKeyContent" = "Nội dung khóa công khai" "publicKeyContent" = "Nội dung khóa công khai"
"keyPath" = "Đường dẫn khóa riêng tư" "keyPath" = "Đường dẫn khóa riêng tư"
@ -169,6 +174,7 @@
"realityDesc" = "Xray core cần phiên bản 1.8.0 hoặc cao hơn." "realityDesc" = "Xray core cần phiên bản 1.8.0 hoặc cao hơn."
"telegramDesc" = "Sử dụng Telegram ID mà không cần ký hiệu @ hoặc chat IDs (bạn có thể nhận được nó ở đây @userinfobot hoặc sử dụng lệnh '/id' trong bot)" "telegramDesc" = "Sử dụng Telegram ID mà không cần ký hiệu @ hoặc chat IDs (bạn có thể nhận được nó ở đây @userinfobot hoặc sử dụng lệnh '/id' trong bot)"
"subscriptionDesc" = "Bạn có thể tìm liên kết đăng ký của mình trong Chi tiết, cũng như bạn có thể sử dụng cùng tên cho nhiều cấu hình khác nhau" "subscriptionDesc" = "Bạn có thể tìm liên kết đăng ký của mình trong Chi tiết, cũng như bạn có thể sử dụng cùng tên cho nhiều cấu hình khác nhau"
"info" = "Thông tin"
[pages.client] [pages.client]
"add" = "Thêm Client" "add" = "Thêm Client"
@ -185,6 +191,8 @@
"delayedStart" = "Bắt đầu sau khi sử dụng lần đầu" "delayedStart" = "Bắt đầu sau khi sử dụng lần đầu"
"expireDays" = "Số ngày hết hạn" "expireDays" = "Số ngày hết hạn"
"days" = "ngày" "days" = "ngày"
"renew" = "Tự động gia hạn"
"renewDesc" = "Tự động gia hạn những ngày sau khi hết hạn. 0 = tắt"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "Nhận" "obtain" = "Nhận"
@ -278,8 +286,8 @@
"subShowInfo" = "Hiển thị thông tin sử dụng" "subShowInfo" = "Hiển thị thông tin sử dụng"
"subShowInfoDesc" = "Hiển thị lưu lượng truy cập còn lại và ngày sau tên cấu hình" "subShowInfoDesc" = "Hiển thị lưu lượng truy cập còn lại và ngày sau tên cấu hình"
[pages.settings.templates] [pages.xray]
"title" = "Mẫu" "title" = "Xray Cài đặt"
"basicTemplate" = "Mẫu Cơ bản" "basicTemplate" = "Mẫu Cơ bản"
"advancedTemplate" = "Mẫu Nâng cao" "advancedTemplate" = "Mẫu Nâng cao"
"completeTemplate" = "Mẫu Đầy đủ" "completeTemplate" = "Mẫu Đầy đủ"

View file

@ -12,7 +12,7 @@
"protocol" = "协议" "protocol" = "协议"
"search" = "搜尋" "search" = "搜尋"
"filter" = "过滤器" "filter" = "过滤器"
"loading" = "加载中" "loading" = "加载中..."
"second" = "秒" "second" = "秒"
"minute" = "分钟" "minute" = "分钟"
"hour" = "小时" "hour" = "小时"
@ -38,6 +38,8 @@
"disabled" = "关闭" "disabled" = "关闭"
"depleted" = "耗尽" "depleted" = "耗尽"
"depletingSoon" = "即将耗尽" "depletingSoon" = "即将耗尽"
"offline" = "离线"
"online" = "在线"
"domainName" = "域名" "domainName" = "域名"
"monitor" = "监听" "monitor" = "监听"
"certificate" = "证书" "certificate" = "证书"
@ -54,6 +56,7 @@
"dashboard" = "系统状态" "dashboard" = "系统状态"
"inbounds" = "入站列表" "inbounds" = "入站列表"
"settings" = "面板设置" "settings" = "面板设置"
"xray" = "Xray 设置"
"logout" = "退出登录" "logout" = "退出登录"
"link" = "其他" "link" = "其他"
@ -121,6 +124,8 @@
"modifyInbound" = "修改入站" "modifyInbound" = "修改入站"
"deleteInbound" = "删除入站" "deleteInbound" = "删除入站"
"deleteInboundContent" = "确定要删除入站吗?" "deleteInboundContent" = "确定要删除入站吗?"
"deleteClient" = "删除客户端"
"deleteClientContent" = "您确定要删除客户端吗?"
"resetTrafficContent" = "确定要重置流量吗?" "resetTrafficContent" = "确定要重置流量吗?"
"copyLink" = "复制链接" "copyLink" = "复制链接"
"address" = "地址" "address" = "地址"
@ -132,8 +137,8 @@
"totalFlow" = "总流量" "totalFlow" = "总流量"
"leaveBlankToNeverExpire" = "留空则永不到期" "leaveBlankToNeverExpire" = "留空则永不到期"
"noRecommendKeepDefault" = "没有特殊需求保持默认即可" "noRecommendKeepDefault" = "没有特殊需求保持默认即可"
"certificatePath" = "证书文件路径" "certificatePath" = "文件路径"
"certificateContent" = "证书文件内容" "certificateContent" = "文件内容"
"publicKeyPath" = "公钥文件路径" "publicKeyPath" = "公钥文件路径"
"publicKeyContent" = "公钥内容" "publicKeyContent" = "公钥内容"
"keyPath" = "密钥文件路径" "keyPath" = "密钥文件路径"
@ -169,6 +174,7 @@
"realityDesc" = "Xray核心需要1.8.0及以上版本" "realityDesc" = "Xray核心需要1.8.0及以上版本"
"telegramDesc" = "使用 Telegram ID不包含 @ 符号或聊天 ID可以在 @userinfobot 处获取,或在机器人中使用'/id'命令)" "telegramDesc" = "使用 Telegram ID不包含 @ 符号或聊天 ID可以在 @userinfobot 处获取,或在机器人中使用'/id'命令)"
"subscriptionDesc" = "您可以在详细信息上找到您的子链接,也可以对多个配置使用相同的名称" "subscriptionDesc" = "您可以在详细信息上找到您的子链接,也可以对多个配置使用相同的名称"
"info" = "信息"
[pages.client] [pages.client]
"add" = "添加客户端" "add" = "添加客户端"
@ -185,6 +191,8 @@
"delayedStart" = "首次使用后开始" "delayedStart" = "首次使用后开始"
"expireDays" = "过期天数" "expireDays" = "过期天数"
"days" = "天" "days" = "天"
"renew" = "自动续订"
"renewDesc" = "过期后自动续订。0 = 禁用"
[pages.inbounds.toasts] [pages.inbounds.toasts]
"obtain" = "获取" "obtain" = "获取"
@ -216,7 +224,6 @@
"resetDefaultConfig" = "重置为默认配置" "resetDefaultConfig" = "重置为默认配置"
"panelSettings" = "面板配置" "panelSettings" = "面板配置"
"securitySettings" = "安全设定" "securitySettings" = "安全设定"
"xrayConfiguration" = "xray 相关设置"
"TGBotSettings" = "TG提醒相关设置" "TGBotSettings" = "TG提醒相关设置"
"panelListeningIP" = "面板监听 IP" "panelListeningIP" = "面板监听 IP"
"panelListeningIPDesc" = "默认留空监听所有 IP" "panelListeningIPDesc" = "默认留空监听所有 IP"
@ -278,8 +285,8 @@
"subShowInfo" = "显示使用信息" "subShowInfo" = "显示使用信息"
"subShowInfoDesc" = "在配置名称后显示剩余流量和日期" "subShowInfoDesc" = "在配置名称后显示剩余流量和日期"
[pages.settings.templates] [pages.xray]
"title" = "模板" "title" = "Xray 设置"
"basicTemplate" = "基本模板" "basicTemplate" = "基本模板"
"advancedTemplate" = "高级模板部件" "advancedTemplate" = "高级模板部件"
"completeTemplate" = "Xray 配置的完整模板" "completeTemplate" = "Xray 配置的完整模板"