diff --git a/sub/sub.go b/sub/sub.go
index db582e8d..4f8f5672 100644
--- a/sub/sub.go
+++ b/sub/sub.go
@@ -107,11 +107,16 @@ func (s *Server) initRouter() (*gin.Engine, error) {
SubJsonRules = ""
}
+ SubTitle, err := s.settingService.GetSubTitle()
+ if err != nil {
+ SubTitle = ""
+ }
+
g := engine.Group("/")
s.sub = NewSUBController(
g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates,
- SubJsonFragment, SubJsonNoises, SubJsonMux, SubJsonRules)
+ SubJsonFragment, SubJsonNoises, SubJsonMux, SubJsonRules, SubTitle)
return engine, nil
}
diff --git a/sub/subController.go b/sub/subController.go
index 9afbc8da..3ee46384 100644
--- a/sub/subController.go
+++ b/sub/subController.go
@@ -9,6 +9,7 @@ import (
)
type SUBController struct {
+ subTitle string
subPath string
subJsonPath string
subEncrypt bool
@@ -30,9 +31,11 @@ func NewSUBController(
jsonNoise string,
jsonMux string,
jsonRules string,
+ subTitle string,
) *SUBController {
sub := NewSubService(showInfo, rModel)
a := &SUBController{
+ subTitle: subTitle,
subPath: subPath,
subJsonPath: jsonPath,
subEncrypt: encrypt,
@@ -82,7 +85,7 @@ func (a *SUBController) subs(c *gin.Context) {
// Add headers
c.Writer.Header().Set("Subscription-Userinfo", header)
c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval)
- c.Writer.Header().Set("Profile-Title", subId)
+ c.Writer.Header().Set("Profile-Title", a.subTitle)
if a.subEncrypt {
c.String(200, base64.StdEncoding.EncodeToString([]byte(result)))
@@ -116,7 +119,7 @@ func (a *SUBController) subJsons(c *gin.Context) {
// Add headers
c.Writer.Header().Set("Subscription-Userinfo", header)
c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval)
- c.Writer.Header().Set("Profile-Title", subId)
+ c.Writer.Header().Set("Profile-Title", a.subTitle)
c.String(200, jsonSub)
}
diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js
index 4c15f420..6c8abe0d 100644
--- a/web/assets/js/model/setting.js
+++ b/web/assets/js/model/setting.js
@@ -26,6 +26,7 @@ class AllSetting {
this.xrayTemplateConfig = "";
this.secretEnable = false;
this.subEnable = false;
+ this.subTitle = "";
this.subListen = "";
this.subPort = 2096;
this.subPath = "/sub/";
diff --git a/web/entity/entity.go b/web/entity/entity.go
index 02d19701..872901b8 100644
--- a/web/entity/entity.go
+++ b/web/entity/entity.go
@@ -40,6 +40,7 @@ type AllSetting struct {
TimeLocation string `json:"timeLocation" form:"timeLocation"`
SecretEnable bool `json:"secretEnable" form:"secretEnable"`
SubEnable bool `json:"subEnable" form:"subEnable"`
+ SubTitle string `json:"subTitle" form:"subTitle"`
SubListen string `json:"subListen" form:"subListen"`
SubPort int `json:"subPort" form:"subPort"`
SubPath string `json:"subPath" form:"subPath"`
diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html
index fe5d7e3a..c8cf93d3 100644
--- a/web/html/xui/inbounds.html
+++ b/web/html/xui/inbounds.html
@@ -662,6 +662,7 @@
refreshInterval: Number(localStorage.getItem("refreshInterval")) || 5000,
subSettings: {
enable : false,
+ subTitle : '',
subURI : '',
subJsonURI : '',
},
@@ -711,6 +712,7 @@
this.tgBotEnable = tgBotEnable;
this.subSettings = {
enable : subEnable,
+ subTitle : subTitle,
subURI: subURI,
subJsonURI: subJsonURI
};
diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html
index 3bfb32a9..d13af57e 100644
--- a/web/html/xui/settings.html
+++ b/web/html/xui/settings.html
@@ -409,6 +409,13 @@
+
+ {{ i18n "pages.settings.subTitle"}}
+ {{ i18n "pages.settings.subTitleDesc"}}
+
+
+
+
{{ i18n "pages.settings.subListen"}}
{{ i18n "pages.settings.subListenDesc"}}
diff --git a/web/service/setting.go b/web/service/setting.go
index ed0f9dc3..5443760c 100644
--- a/web/service/setting.go
+++ b/web/service/setting.go
@@ -50,6 +50,7 @@ var defaultValueMap = map[string]string{
"tgLang": "en-US",
"secretEnable": "false",
"subEnable": "false",
+ "subTitle": "",
"subListen": "",
"subPort": "2096",
"subPath": "/sub/",
@@ -418,6 +419,10 @@ func (s *SettingService) GetSubEnable() (bool, error) {
return s.getBool("subEnable")
}
+func (s *SettingService) GetSubTitle() (string, error) {
+ return s.getString("subTitle")
+}
+
func (s *SettingService) GetSubListen() (string, error) {
return s.getString("subListen")
}
@@ -562,6 +567,7 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) {
"defaultKey": func() (any, error) { return s.GetKeyFile() },
"tgBotEnable": func() (any, error) { return s.GetTgbotEnabled() },
"subEnable": func() (any, error) { return s.GetSubEnable() },
+ "subTitle": func() (any, error) { return s.GetSubTitle() },
"subURI": func() (any, error) { return s.GetSubURI() },
"subJsonURI": func() (any, error) { return s.GetSubJsonURI() },
"remarkModel": func() (any, error) { return s.GetRemarkModel() },
@@ -581,6 +587,7 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) {
if result["subEnable"].(bool) && (result["subURI"].(string) == "" || result["subJsonURI"].(string) == "") {
subURI := ""
+ subTitle, _ := s.GetSubTitle()
subPort, _ := s.GetSubPort()
subPath, _ := s.GetSubPath()
subJsonPath, _ := s.GetSubJsonPath()
@@ -607,6 +614,9 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) {
if result["subURI"].(string) == "" {
result["subURI"] = subURI + subPath
}
+ if result["subTitle"].(string) == "" {
+ result["subTitle"] = subTitle
+ }
if result["subJsonURI"].(string) == "" {
result["subJsonURI"] = subURI + subJsonPath
}
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index f06e2cad..f09a9e79 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -292,6 +292,8 @@
"subSettings" = "Subscription"
"subEnable" = "Enable Subscription Service"
"subEnableDesc" = "Enables the subscription service."
+"subTitle" = "Subscription Title"
+ "subTitleDesc" = "Title shown in VPN client"
"subListen" = "Listen IP"
"subListenDesc" = "The IP address for the subscription service. (leave blank to listen on all IPs)"
"subPort" = "Listen Port"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 81ba9c20..e1f3af28 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -292,6 +292,8 @@
"subSettings" = "Suscripción"
"subEnable" = "Habilitar Servicio"
"subEnableDesc" = "Función de suscripción con configuración separada."
+"subTitle" = "Título de la Suscripción"
+"subTitleDesc" = "Título mostrado en el cliente de VPN"
"subListen" = "Listening IP"
"subListenDesc" = "Dejar en blanco por defecto para monitorear todas las IPs."
"subPort" = "Puerto de Suscripción"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index a50bf960..319a3a74 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -292,6 +292,8 @@
"subSettings" = "سابسکریپشن"
"subEnable" = "فعالسازی سرویس سابسکریپشن"
"subEnableDesc" = "سرویس سابسکریپشن را فعالمیکند"
+"subTitle" = "عنوان اشتراک"
+"subTitleDesc" = "عنوان نمایش داده شده در کلاینت VPN"
"subListen" = "آدرس آیپی"
"subListenDesc" = "آدرس آیپی برای سرویس سابسکریپشن. برای گوش دادن بهتمام آیپیها خالیبگذارید"
"subPort" = "پورت"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index 95222495..e578f2d6 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -292,6 +292,8 @@
"subSettings" = "Langganan"
"subEnable" = "Aktifkan Layanan Langganan"
"subEnableDesc" = "Mengaktifkan layanan langganan."
+"subTitle" = "Judul Langganan"
+"subTitleDesc" = "Judul yang ditampilkan di klien VPN"
"subListen" = "IP Pendengar"
"subListenDesc" = "Alamat IP untuk layanan langganan. (biarkan kosong untuk mendengarkan semua IP)"
"subPort" = "Port Pendengar"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index 1b116564..ffaf7abd 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -292,6 +292,8 @@
"subSettings" = "サブスクリプション設定"
"subEnable" = "サブスクリプションサービスを有効にする"
"subEnableDesc" = "サブスクリプションサービス機能を有効にする"
+"subTitle" = "サブスクリプションタイトル"
+"subTitleDesc" = "VPNクライアントに表示されるタイトル"
"subListen" = "監視IP"
"subListenDesc" = "サブスクリプションサービスが監視するIPアドレス(空白にするとすべてのIPを監視)"
"subPort" = "監視ポート"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index 24b40474..dc33ac24 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -292,6 +292,8 @@
"subSettings" = "Assinatura"
"subEnable" = "Ativar Serviço de Assinatura"
"subEnableDesc" = "Ativa o serviço de assinatura."
+"subTitle" = "Título da Assinatura"
+"subTitleDesc" = "Título exibido no cliente VPN"
"subListen" = "IP de Escuta"
"subListenDesc" = "O endereço IP para o serviço de assinatura. (deixe em branco para escutar em todos os IPs)"
"subPort" = "Porta de Escuta"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 86150ff8..80787e24 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -292,6 +292,8 @@
"subSettings" = "Подписка"
"subEnable" = "Включить службу"
"subEnableDesc" = "Функция подписки с отдельной конфигурацией"
+"subTitle" = "Заголовок подписки"
+ "subTitleDesc" = "Название подписки, которое видит клиент в VPN клиенте"
"subListen" = "Прослушивание IP"
"subListenDesc" = "Оставьте пустым по умолчанию, чтобы отслеживать все IP-адреса"
"subPort" = "Порт подписки"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index f033e440..ee773b21 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -292,6 +292,8 @@
"subSettings" = "Abonelik"
"subEnable" = "Abonelik Hizmetini Etkinleştir"
"subEnableDesc" = "Abonelik hizmetini etkinleştirir."
+"subTitle" = "Abonelik Başlığı"
+"subTitleDesc" = "VPN istemcisinde gösterilen başlık"
"subListen" = "Dinleme IP"
"subListenDesc" = "Abonelik hizmeti için IP adresi. (tüm IP'leri dinlemek için boş bırakın)"
"subPort" = "Dinleme Portu"
diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml
index 29bf6c63..705a066b 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -292,6 +292,8 @@
"subSettings" = "Підписка"
"subEnable" = "Увімкнути службу підписки"
"subEnableDesc" = "Вмикає службу підписки."
+"subTitle" = "Назва Підписки"
+"subTitleDesc" = "Назва, яка відображається у VPN-клієнті"
"subListen" = "Слухати IP"
"subListenDesc" = "IP-адреса для служби підписки. (залиште порожнім, щоб слухати всі IP-адреси)"
"subPort" = "Слухати порт"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index ec9f9485..a2a07e42 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -292,6 +292,8 @@
"subSettings" = "Gói đăng ký"
"subEnable" = "Bật dịch vụ"
"subEnableDesc" = "Tính năng gói đăng ký với cấu hình riêng"
+"subTitle" = "Tiêu đề Đăng ký"
+"subTitleDesc" = "Tiêu đề hiển thị trong ứng dụng VPN"
"subListen" = "Listening IP"
"subListenDesc" = "Mặc định để trống để nghe tất cả các IP"
"subPort" = "Cổng gói đăng ký"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml
index a4a0dc4e..848de7d5 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -292,6 +292,8 @@
"subSettings" = "订阅设置"
"subEnable" = "启用订阅服务"
"subEnableDesc" = "启用订阅服务功能"
+"subTitle" = "订阅标题"
+"subTitleDesc" = "在VPN客户端中显示的标题"
"subListen" = "监听 IP"
"subListenDesc" = "订阅服务监听的 IP 地址(留空表示监听所有 IP)"
"subPort" = "监听端口"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index f12f6d5b..16196d9a 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -292,6 +292,8 @@
"subSettings" = "訂閱設定"
"subEnable" = "啟用訂閱服務"
"subEnableDesc" = "啟用訂閱服務功能"
+"subTitle" = "訂閱標題"
+"subTitleDesc" = "在VPN客戶端中顯示的標題"
"subListen" = "監聽 IP"
"subListenDesc" = "訂閱服務監聽的 IP 地址(留空表示監聽所有 IP)"
"subPort" = "監聽埠"