mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-08-23 11:27:13 +00:00
feat(sub): add option to hide server settings in subscription (happ) (#5433)
* feat(settings): add option to hide server settings in subscription
* chore: regenerate codegen and add translations for subHideSettings
- Update frontend/src/generated/{types,schemas,zod,examples}.ts to include
subHideSettings (bool) in AllSetting and AllSettingView
- Add subHideSettings / subHideSettingsDesc translation keys to all 11
remaining locales: ar-EG, fa-IR, es-ES, id-ID, ja-JP, pt-BR, uk-UA,
tr-TR, zh-TW, zh-CN, vi-VN
Co-authored-by: IgorKha <IgorKha@users.noreply.github.com>
Co-authored-by: Sanaei <MHSanaei@users.noreply.github.com>
* fix(sub): add subHideSettings default to settings map
Every other sub* setting has an entry in defaultValueMap; subHideSettings was missing, so GetSubHideSettings hit the 'key not in defaultValueMap' error path on a fresh install (only masked by the false fallback in sub.go). Add the default for consistency.
This commit is contained in:
@@ -50,6 +50,7 @@ export const EXAMPLES: Record<string, unknown> = {
|
|||||||
"subEnable": false,
|
"subEnable": false,
|
||||||
"subEnableRouting": false,
|
"subEnableRouting": false,
|
||||||
"subEncrypt": false,
|
"subEncrypt": false,
|
||||||
|
"subHideSettings": false,
|
||||||
"subJsonEnable": false,
|
"subJsonEnable": false,
|
||||||
"subJsonFinalMask": "",
|
"subJsonFinalMask": "",
|
||||||
"subJsonMux": "",
|
"subJsonMux": "",
|
||||||
@@ -147,6 +148,7 @@ export const EXAMPLES: Record<string, unknown> = {
|
|||||||
"subEnable": false,
|
"subEnable": false,
|
||||||
"subEnableRouting": false,
|
"subEnableRouting": false,
|
||||||
"subEncrypt": false,
|
"subEncrypt": false,
|
||||||
|
"subHideSettings": false,
|
||||||
"subJsonEnable": false,
|
"subJsonEnable": false,
|
||||||
"subJsonFinalMask": "",
|
"subJsonFinalMask": "",
|
||||||
"subJsonMux": "",
|
"subJsonMux": "",
|
||||||
|
|||||||
@@ -196,6 +196,10 @@ export const SCHEMAS: Record<string, unknown> = {
|
|||||||
"description": "Encrypt subscription responses",
|
"description": "Encrypt subscription responses",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"subHideSettings": {
|
||||||
|
"description": "Hide server settings in happ subscription (Only for Happ)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"subJsonEnable": {
|
"subJsonEnable": {
|
||||||
"description": "Enable JSON subscription endpoint",
|
"description": "Enable JSON subscription endpoint",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
@@ -413,6 +417,7 @@ export const SCHEMAS: Record<string, unknown> = {
|
|||||||
"subEnable",
|
"subEnable",
|
||||||
"subEnableRouting",
|
"subEnableRouting",
|
||||||
"subEncrypt",
|
"subEncrypt",
|
||||||
|
"subHideSettings",
|
||||||
"subJsonEnable",
|
"subJsonEnable",
|
||||||
"subJsonFinalMask",
|
"subJsonFinalMask",
|
||||||
"subJsonMux",
|
"subJsonMux",
|
||||||
@@ -672,6 +677,10 @@ export const SCHEMAS: Record<string, unknown> = {
|
|||||||
"description": "Encrypt subscription responses",
|
"description": "Encrypt subscription responses",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"subHideSettings": {
|
||||||
|
"description": "Hide server settings in happ subscription (Only for Happ)",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"subJsonEnable": {
|
"subJsonEnable": {
|
||||||
"description": "Enable JSON subscription endpoint",
|
"description": "Enable JSON subscription endpoint",
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
@@ -896,6 +905,7 @@ export const SCHEMAS: Record<string, unknown> = {
|
|||||||
"subEnable",
|
"subEnable",
|
||||||
"subEnableRouting",
|
"subEnableRouting",
|
||||||
"subEncrypt",
|
"subEncrypt",
|
||||||
|
"subHideSettings",
|
||||||
"subJsonEnable",
|
"subJsonEnable",
|
||||||
"subJsonFinalMask",
|
"subJsonFinalMask",
|
||||||
"subJsonMux",
|
"subJsonMux",
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ export interface AllSetting {
|
|||||||
subEnable: boolean;
|
subEnable: boolean;
|
||||||
subEnableRouting: boolean;
|
subEnableRouting: boolean;
|
||||||
subEncrypt: boolean;
|
subEncrypt: boolean;
|
||||||
|
subHideSettings: boolean;
|
||||||
subJsonEnable: boolean;
|
subJsonEnable: boolean;
|
||||||
subJsonFinalMask: string;
|
subJsonFinalMask: string;
|
||||||
subJsonMux: string;
|
subJsonMux: string;
|
||||||
@@ -154,6 +155,7 @@ export interface AllSettingView {
|
|||||||
subEnable: boolean;
|
subEnable: boolean;
|
||||||
subEnableRouting: boolean;
|
subEnableRouting: boolean;
|
||||||
subEncrypt: boolean;
|
subEncrypt: boolean;
|
||||||
|
subHideSettings: boolean;
|
||||||
subJsonEnable: boolean;
|
subJsonEnable: boolean;
|
||||||
subJsonFinalMask: string;
|
subJsonFinalMask: string;
|
||||||
subJsonMux: string;
|
subJsonMux: string;
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export const AllSettingSchema = z.object({
|
|||||||
subEnable: z.boolean(),
|
subEnable: z.boolean(),
|
||||||
subEnableRouting: z.boolean(),
|
subEnableRouting: z.boolean(),
|
||||||
subEncrypt: z.boolean(),
|
subEncrypt: z.boolean(),
|
||||||
|
subHideSettings: z.boolean(),
|
||||||
subJsonEnable: z.boolean(),
|
subJsonEnable: z.boolean(),
|
||||||
subJsonFinalMask: z.string(),
|
subJsonFinalMask: z.string(),
|
||||||
subJsonMux: z.string(),
|
subJsonMux: z.string(),
|
||||||
@@ -167,6 +168,7 @@ export const AllSettingViewSchema = z.object({
|
|||||||
subEnable: z.boolean(),
|
subEnable: z.boolean(),
|
||||||
subEnableRouting: z.boolean(),
|
subEnableRouting: z.boolean(),
|
||||||
subEncrypt: z.boolean(),
|
subEncrypt: z.boolean(),
|
||||||
|
subHideSettings: z.boolean(),
|
||||||
subJsonEnable: z.boolean(),
|
subJsonEnable: z.boolean(),
|
||||||
subJsonFinalMask: z.string(),
|
subJsonFinalMask: z.string(),
|
||||||
subJsonMux: z.string(),
|
subJsonMux: z.string(),
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ export class AllSetting {
|
|||||||
subJsonRules = '';
|
subJsonRules = '';
|
||||||
subJsonFinalMask = '';
|
subJsonFinalMask = '';
|
||||||
subThemeDir = '';
|
subThemeDir = '';
|
||||||
|
subHideSettings = false;
|
||||||
|
|
||||||
timeLocation = 'Local';
|
timeLocation = 'Local';
|
||||||
|
|
||||||
|
|||||||
@@ -153,6 +153,9 @@ export default function SubscriptionGeneralTab({ allSetting, updateSetting }: Su
|
|||||||
<Input.TextArea value={allSetting.subRoutingRules} placeholder="happ://routing/add/..."
|
<Input.TextArea value={allSetting.subRoutingRules} placeholder="happ://routing/add/..."
|
||||||
onChange={(e) => updateSetting({ subRoutingRules: e.target.value })} />
|
onChange={(e) => updateSetting({ subRoutingRules: e.target.value })} />
|
||||||
</SettingListItem>
|
</SettingListItem>
|
||||||
|
<SettingListItem paddings="small" title={t('pages.settings.subHideSettings')} description={t('pages.settings.subHideSettingsDesc')}>
|
||||||
|
<Switch checked={allSetting.subHideSettings} onChange={(v) => updateSetting({ subHideSettings: v })} />
|
||||||
|
</SettingListItem>
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ export const AllSettingSchema = z.object({
|
|||||||
subJsonMux: z.string().optional(),
|
subJsonMux: z.string().optional(),
|
||||||
subJsonRules: z.string().optional(),
|
subJsonRules: z.string().optional(),
|
||||||
subJsonFinalMask: z.string().optional(),
|
subJsonFinalMask: z.string().optional(),
|
||||||
|
subHideSettings: z.boolean().optional(),
|
||||||
timeLocation: z.string().optional(),
|
timeLocation: z.string().optional(),
|
||||||
ldapEnable: z.boolean().optional(),
|
ldapEnable: z.boolean().optional(),
|
||||||
ldapHost: z.string().optional(),
|
ldapHost: z.string().optional(),
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ type SUBController struct {
|
|||||||
subAnnounce string
|
subAnnounce string
|
||||||
subEnableRouting bool
|
subEnableRouting bool
|
||||||
subRoutingRules string
|
subRoutingRules string
|
||||||
|
subHideSettings bool
|
||||||
subPath string
|
subPath string
|
||||||
subJsonPath string
|
subJsonPath string
|
||||||
subClashPath string
|
subClashPath string
|
||||||
@@ -87,6 +88,7 @@ func NewSUBController(
|
|||||||
subAnnounce string,
|
subAnnounce string,
|
||||||
subEnableRouting bool,
|
subEnableRouting bool,
|
||||||
subRoutingRules string,
|
subRoutingRules string,
|
||||||
|
subHideSettings bool,
|
||||||
) *SUBController {
|
) *SUBController {
|
||||||
sub := NewSubService(remarkTemplate)
|
sub := NewSubService(remarkTemplate)
|
||||||
a := &SUBController{
|
a := &SUBController{
|
||||||
@@ -96,6 +98,7 @@ func NewSUBController(
|
|||||||
subAnnounce: subAnnounce,
|
subAnnounce: subAnnounce,
|
||||||
subEnableRouting: subEnableRouting,
|
subEnableRouting: subEnableRouting,
|
||||||
subRoutingRules: subRoutingRules,
|
subRoutingRules: subRoutingRules,
|
||||||
|
subHideSettings: subHideSettings,
|
||||||
subPath: subPath,
|
subPath: subPath,
|
||||||
subJsonPath: jsonPath,
|
subJsonPath: jsonPath,
|
||||||
subClashPath: clashPath,
|
subClashPath: clashPath,
|
||||||
@@ -178,7 +181,7 @@ func (a *SUBController) subs(c *gin.Context) {
|
|||||||
if profileUrl == "" {
|
if profileUrl == "" {
|
||||||
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
||||||
}
|
}
|
||||||
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules)
|
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules, a.subHideSettings)
|
||||||
|
|
||||||
if a.subEncrypt {
|
if a.subEncrypt {
|
||||||
c.String(200, base64.StdEncoding.EncodeToString([]byte(result.String())))
|
c.String(200, base64.StdEncoding.EncodeToString([]byte(result.String())))
|
||||||
@@ -357,7 +360,7 @@ func (a *SUBController) subJsons(c *gin.Context) {
|
|||||||
if profileUrl == "" {
|
if profileUrl == "" {
|
||||||
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
||||||
}
|
}
|
||||||
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules)
|
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules, a.subHideSettings)
|
||||||
|
|
||||||
c.String(200, jsonSub)
|
c.String(200, jsonSub)
|
||||||
}
|
}
|
||||||
@@ -374,7 +377,7 @@ func (a *SUBController) subClashs(c *gin.Context) {
|
|||||||
if profileUrl == "" {
|
if profileUrl == "" {
|
||||||
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
profileUrl = fmt.Sprintf("%s://%s%s", scheme, hostWithPort, c.Request.RequestURI)
|
||||||
}
|
}
|
||||||
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules)
|
a.ApplyCommonHeaders(c, header, a.updateInterval, a.subTitle, a.subSupportUrl, profileUrl, a.subAnnounce, a.subEnableRouting, a.subRoutingRules, a.subHideSettings)
|
||||||
if a.subTitle != "" {
|
if a.subTitle != "" {
|
||||||
// Clash clients commonly use Content-Disposition to choose the imported profile name.
|
// Clash clients commonly use Content-Disposition to choose the imported profile name.
|
||||||
c.Writer.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename*=UTF-8''%s`, url.PathEscape(a.subTitle)))
|
c.Writer.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename*=UTF-8''%s`, url.PathEscape(a.subTitle)))
|
||||||
@@ -394,6 +397,7 @@ func (a *SUBController) ApplyCommonHeaders(
|
|||||||
profileAnnounce string,
|
profileAnnounce string,
|
||||||
profileEnableRouting bool,
|
profileEnableRouting bool,
|
||||||
profileRoutingRules string,
|
profileRoutingRules string,
|
||||||
|
profileHideSettings bool,
|
||||||
) {
|
) {
|
||||||
c.Writer.Header().Set("Subscription-Userinfo", header)
|
c.Writer.Header().Set("Subscription-Userinfo", header)
|
||||||
c.Writer.Header().Set("Profile-Update-Interval", updateInterval)
|
c.Writer.Header().Set("Profile-Update-Interval", updateInterval)
|
||||||
@@ -417,4 +421,7 @@ func (a *SUBController) ApplyCommonHeaders(
|
|||||||
if profileRoutingRules != "" {
|
if profileRoutingRules != "" {
|
||||||
c.Writer.Header().Set("Routing", profileRoutingRules)
|
c.Writer.Header().Set("Routing", profileRoutingRules)
|
||||||
}
|
}
|
||||||
|
if profileHideSettings {
|
||||||
|
c.Writer.Header().Set("Hide-Settings", "1")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -170,6 +170,11 @@ func (s *Server) initRouter() (*gin.Engine, error) {
|
|||||||
SubRoutingRules = ""
|
SubRoutingRules = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SubHideSettings, err := s.settingService.GetSubHideSettings()
|
||||||
|
if err != nil {
|
||||||
|
SubHideSettings = false
|
||||||
|
}
|
||||||
|
|
||||||
// set per-request localizer from headers/cookies
|
// set per-request localizer from headers/cookies
|
||||||
engine.Use(locale.LocalizerMiddleware())
|
engine.Use(locale.LocalizerMiddleware())
|
||||||
|
|
||||||
@@ -227,7 +232,7 @@ func (s *Server) initRouter() (*gin.Engine, error) {
|
|||||||
s.sub = NewSUBController(
|
s.sub = NewSUBController(
|
||||||
g, LinksPath, JsonPath, ClashPath, subJsonEnable, subClashEnable, Encrypt, RemarkTemplate, SubUpdates,
|
g, LinksPath, JsonPath, ClashPath, subJsonEnable, subClashEnable, Encrypt, RemarkTemplate, SubUpdates,
|
||||||
SubJsonMux, SubJsonRules, SubJsonFinalMask, SubClashEnableRouting, SubClashRules, SubTitle, SubSupportUrl,
|
SubJsonMux, SubJsonRules, SubJsonFinalMask, SubClashEnableRouting, SubClashRules, SubTitle, SubSupportUrl,
|
||||||
SubProfileUrl, SubAnnounce, SubEnableRouting, SubRoutingRules)
|
SubProfileUrl, SubAnnounce, SubEnableRouting, SubRoutingRules, SubHideSettings)
|
||||||
|
|
||||||
return engine, nil
|
return engine, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ type AllSetting struct {
|
|||||||
SubJsonRules string `json:"subJsonRules" form:"subJsonRules"`
|
SubJsonRules string `json:"subJsonRules" form:"subJsonRules"`
|
||||||
SubJsonFinalMask string `json:"subJsonFinalMask" form:"subJsonFinalMask"` // JSON subscription global finalmask (tcp/udp masks + quicParams)
|
SubJsonFinalMask string `json:"subJsonFinalMask" form:"subJsonFinalMask"` // JSON subscription global finalmask (tcp/udp masks + quicParams)
|
||||||
SubThemeDir string `json:"subThemeDir" form:"subThemeDir"` // Absolute path to a folder containing a custom subscription page template
|
SubThemeDir string `json:"subThemeDir" form:"subThemeDir"` // Absolute path to a folder containing a custom subscription page template
|
||||||
|
SubHideSettings bool `json:"subHideSettings" form:"subHideSettings"` // Hide server settings in happ subscription (Only for Happ)
|
||||||
|
|
||||||
// LDAP settings
|
// LDAP settings
|
||||||
LdapEnable bool `json:"ldapEnable" form:"ldapEnable"`
|
LdapEnable bool `json:"ldapEnable" form:"ldapEnable"`
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ var defaultValueMap = map[string]string{
|
|||||||
"subAnnounce": "",
|
"subAnnounce": "",
|
||||||
"subEnableRouting": "false",
|
"subEnableRouting": "false",
|
||||||
"subRoutingRules": "",
|
"subRoutingRules": "",
|
||||||
|
"subHideSettings": "false",
|
||||||
"subListen": "",
|
"subListen": "",
|
||||||
"subPort": "2096",
|
"subPort": "2096",
|
||||||
"subPath": "/sub/",
|
"subPath": "/sub/",
|
||||||
@@ -692,6 +693,10 @@ func (s *SettingService) GetSubRoutingRules() (string, error) {
|
|||||||
return s.getString("subRoutingRules")
|
return s.getString("subRoutingRules")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SettingService) GetSubHideSettings() (bool, error) {
|
||||||
|
return s.getBool("subHideSettings")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SettingService) GetSubListen() (string, error) {
|
func (s *SettingService) GetSubListen() (string, error) {
|
||||||
return s.getString("subListen")
|
return s.getString("subListen")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "إعداد عام لتمكين التوجيه (Routing) في عميل VPN. (فقط لـ Happ)",
|
"subEnableRoutingDesc": "إعداد عام لتمكين التوجيه (Routing) في عميل VPN. (فقط لـ Happ)",
|
||||||
"subRoutingRules": "قواعد التوجيه",
|
"subRoutingRules": "قواعد التوجيه",
|
||||||
"subRoutingRulesDesc": "قواعد التوجيه العامة لعميل VPN. (فقط لـ Happ)",
|
"subRoutingRulesDesc": "قواعد التوجيه العامة لعميل VPN. (فقط لـ Happ)",
|
||||||
|
"subHideSettings": "إخفاء إعدادات الخادم",
|
||||||
|
"subHideSettingsDesc": "إخفاء إمكانية عرض وتعديل إعدادات الخادم في عميل VPN. (فقط لـ Happ)",
|
||||||
"subClashEnableRouting": "تفعيل التوجيه",
|
"subClashEnableRouting": "تفعيل التوجيه",
|
||||||
"subClashEnableRoutingDesc": "تضمين قواعد توجيه Clash/Mihomo العامة في اشتراكات YAML المُنشأة.",
|
"subClashEnableRoutingDesc": "تضمين قواعد توجيه Clash/Mihomo العامة في اشتراكات YAML المُنشأة.",
|
||||||
"subClashRoutingRules": "قواعد التوجيه العامة",
|
"subClashRoutingRules": "قواعد التوجيه العامة",
|
||||||
|
|||||||
@@ -1200,6 +1200,8 @@
|
|||||||
"subEnableRoutingDesc": "Global setting to enable routing in the VPN client. (Only for Happ)",
|
"subEnableRoutingDesc": "Global setting to enable routing in the VPN client. (Only for Happ)",
|
||||||
"subRoutingRules": "Routing rules",
|
"subRoutingRules": "Routing rules",
|
||||||
"subRoutingRulesDesc": "Global routing rules for the VPN client. (Only for Happ)",
|
"subRoutingRulesDesc": "Global routing rules for the VPN client. (Only for Happ)",
|
||||||
|
"subHideSettings": "Hide server settings",
|
||||||
|
"subHideSettingsDesc": "Hide the ability to view and edit server configurations in the VPN client. (Only for Happ)",
|
||||||
"subClashEnableRouting": "Enable routing",
|
"subClashEnableRouting": "Enable routing",
|
||||||
"subClashEnableRoutingDesc": "Include global Clash/Mihomo routing rules in generated YAML subscriptions.",
|
"subClashEnableRoutingDesc": "Include global Clash/Mihomo routing rules in generated YAML subscriptions.",
|
||||||
"subClashRoutingRules": "Global routing rules",
|
"subClashRoutingRules": "Global routing rules",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Configuración global para habilitar el enrutamiento en el cliente VPN. (Solo para Happ)",
|
"subEnableRoutingDesc": "Configuración global para habilitar el enrutamiento en el cliente VPN. (Solo para Happ)",
|
||||||
"subRoutingRules": "Reglas de enrutamiento",
|
"subRoutingRules": "Reglas de enrutamiento",
|
||||||
"subRoutingRulesDesc": "Reglas de enrutamiento globales para el cliente VPN. (Solo para Happ)",
|
"subRoutingRulesDesc": "Reglas de enrutamiento globales para el cliente VPN. (Solo para Happ)",
|
||||||
|
"subHideSettings": "Ocultar configuración del servidor",
|
||||||
|
"subHideSettingsDesc": "Ocultar la posibilidad de ver y editar las configuraciones del servidor en el cliente VPN. (Solo para Happ)",
|
||||||
"subClashEnableRouting": "Habilitar enrutamiento",
|
"subClashEnableRouting": "Habilitar enrutamiento",
|
||||||
"subClashEnableRoutingDesc": "Incluir reglas globales de enrutamiento Clash/Mihomo en las suscripciones YAML generadas.",
|
"subClashEnableRoutingDesc": "Incluir reglas globales de enrutamiento Clash/Mihomo en las suscripciones YAML generadas.",
|
||||||
"subClashRoutingRules": "Reglas globales de enrutamiento",
|
"subClashRoutingRules": "Reglas globales de enrutamiento",
|
||||||
|
|||||||
@@ -1092,6 +1092,8 @@
|
|||||||
"subEnableRoutingDesc": "تنظیمات سراسری برای فعالسازی مسیریابی در کلاینت VPN. (فقط برای Happ)",
|
"subEnableRoutingDesc": "تنظیمات سراسری برای فعالسازی مسیریابی در کلاینت VPN. (فقط برای Happ)",
|
||||||
"subRoutingRules": "قوانین مسیریابی",
|
"subRoutingRules": "قوانین مسیریابی",
|
||||||
"subRoutingRulesDesc": "قوانین مسیریابی سراسری برای کلاینت VPN. (فقط برای Happ)",
|
"subRoutingRulesDesc": "قوانین مسیریابی سراسری برای کلاینت VPN. (فقط برای Happ)",
|
||||||
|
"subHideSettings": "پنهان کردن تنظیمات سرور",
|
||||||
|
"subHideSettingsDesc": "پنهان کردن توانایی مشاهده و ویرایش پیکربندی سرور در کلاینت VPN. (فقط برای Happ)",
|
||||||
"subClashEnableRouting": "فعالسازی مسیریابی",
|
"subClashEnableRouting": "فعالسازی مسیریابی",
|
||||||
"subClashEnableRoutingDesc": "قوانین مسیریابی سراسری Clash/Mihomo را در اشتراکهای YAML تولیدشده وارد کن.",
|
"subClashEnableRoutingDesc": "قوانین مسیریابی سراسری Clash/Mihomo را در اشتراکهای YAML تولیدشده وارد کن.",
|
||||||
"subClashRoutingRules": "قوانین مسیریابی سراسری",
|
"subClashRoutingRules": "قوانین مسیریابی سراسری",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Pengaturan global untuk mengaktifkan perutean (routing) di klien VPN. (Hanya untuk Happ)",
|
"subEnableRoutingDesc": "Pengaturan global untuk mengaktifkan perutean (routing) di klien VPN. (Hanya untuk Happ)",
|
||||||
"subRoutingRules": "Aturan routing",
|
"subRoutingRules": "Aturan routing",
|
||||||
"subRoutingRulesDesc": "Aturan routing global untuk klien VPN. (Hanya untuk Happ)",
|
"subRoutingRulesDesc": "Aturan routing global untuk klien VPN. (Hanya untuk Happ)",
|
||||||
|
"subHideSettings": "Sembunyikan pengaturan server",
|
||||||
|
"subHideSettingsDesc": "Menyembunyikan kemampuan untuk melihat dan mengedit konfigurasi server di klien VPN. (Hanya untuk Happ)",
|
||||||
"subClashEnableRouting": "Aktifkan routing",
|
"subClashEnableRouting": "Aktifkan routing",
|
||||||
"subClashEnableRoutingDesc": "Sertakan aturan routing global Clash/Mihomo dalam langganan YAML yang dibuat.",
|
"subClashEnableRoutingDesc": "Sertakan aturan routing global Clash/Mihomo dalam langganan YAML yang dibuat.",
|
||||||
"subClashRoutingRules": "Aturan routing global",
|
"subClashRoutingRules": "Aturan routing global",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "VPNクライアントでルーティングを有効にするためのグローバル設定。(Happのみ)",
|
"subEnableRoutingDesc": "VPNクライアントでルーティングを有効にするためのグローバル設定。(Happのみ)",
|
||||||
"subRoutingRules": "ルーティングルール",
|
"subRoutingRules": "ルーティングルール",
|
||||||
"subRoutingRulesDesc": "VPNクライアントのグローバルルーティングルール。(Happのみ)",
|
"subRoutingRulesDesc": "VPNクライアントのグローバルルーティングルール。(Happのみ)",
|
||||||
|
"subHideSettings": "サーバー設定を非表示",
|
||||||
|
"subHideSettingsDesc": "VPNクライアントでサーバー設定の表示・編集機能を非表示にします。(Happのみ)",
|
||||||
"subClashEnableRouting": "ルーティングを有効化",
|
"subClashEnableRouting": "ルーティングを有効化",
|
||||||
"subClashEnableRoutingDesc": "生成されたYAMLサブスクリプションにClash/Mihomoのグローバルルーティングルールを含めます。",
|
"subClashEnableRoutingDesc": "生成されたYAMLサブスクリプションにClash/Mihomoのグローバルルーティングルールを含めます。",
|
||||||
"subClashRoutingRules": "グローバルルーティングルール",
|
"subClashRoutingRules": "グローバルルーティングルール",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Configuração global para habilitar o roteamento no cliente VPN. (Apenas para Happ)",
|
"subEnableRoutingDesc": "Configuração global para habilitar o roteamento no cliente VPN. (Apenas para Happ)",
|
||||||
"subRoutingRules": "Regras de roteamento",
|
"subRoutingRules": "Regras de roteamento",
|
||||||
"subRoutingRulesDesc": "Regras de roteamento globais para o cliente VPN. (Apenas para Happ)",
|
"subRoutingRulesDesc": "Regras de roteamento globais para o cliente VPN. (Apenas para Happ)",
|
||||||
|
"subHideSettings": "Ocultar configurações do servidor",
|
||||||
|
"subHideSettingsDesc": "Ocultar a capacidade de visualizar e editar as configurações do servidor no cliente VPN. (Apenas para Happ)",
|
||||||
"subClashEnableRouting": "Ativar roteamento",
|
"subClashEnableRouting": "Ativar roteamento",
|
||||||
"subClashEnableRoutingDesc": "Incluir regras globais de roteamento Clash/Mihomo nas assinaturas YAML geradas.",
|
"subClashEnableRoutingDesc": "Incluir regras globais de roteamento Clash/Mihomo nas assinaturas YAML geradas.",
|
||||||
"subClashRoutingRules": "Regras globais de roteamento",
|
"subClashRoutingRules": "Regras globais de roteamento",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Глобальная настройка для включения маршрутизации в VPN-клиенте. (Только для Happ)",
|
"subEnableRoutingDesc": "Глобальная настройка для включения маршрутизации в VPN-клиенте. (Только для Happ)",
|
||||||
"subRoutingRules": "Правила маршрутизации",
|
"subRoutingRules": "Правила маршрутизации",
|
||||||
"subRoutingRulesDesc": "Глобальные правила маршрутизации для VPN-клиента. (Только для Happ)",
|
"subRoutingRulesDesc": "Глобальные правила маршрутизации для VPN-клиента. (Только для Happ)",
|
||||||
|
"subHideSettings": "Скрыть настройки сервера",
|
||||||
|
"subHideSettingsDesc": "Скрыть возможность просмотра и редактирования конфигурации сервера в VPN-клиенте. (Только для Happ)",
|
||||||
"subClashEnableRouting": "Включить маршрутизацию",
|
"subClashEnableRouting": "Включить маршрутизацию",
|
||||||
"subClashEnableRoutingDesc": "Добавлять глобальные правила маршрутизации Clash/Mihomo в сгенерированные YAML-подписки.",
|
"subClashEnableRoutingDesc": "Добавлять глобальные правила маршрутизации Clash/Mihomo в сгенерированные YAML-подписки.",
|
||||||
"subClashRoutingRules": "Глобальные правила маршрутизации",
|
"subClashRoutingRules": "Глобальные правила маршрутизации",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "VPN istemcisinde yönlendirmeyi etkinleştirmek için genel ayar. (Yalnızca Happ için)",
|
"subEnableRoutingDesc": "VPN istemcisinde yönlendirmeyi etkinleştirmek için genel ayar. (Yalnızca Happ için)",
|
||||||
"subRoutingRules": "Yönlendirme kuralları",
|
"subRoutingRules": "Yönlendirme kuralları",
|
||||||
"subRoutingRulesDesc": "VPN istemcisi için genel yönlendirme kuralları. (Yalnızca Happ için)",
|
"subRoutingRulesDesc": "VPN istemcisi için genel yönlendirme kuralları. (Yalnızca Happ için)",
|
||||||
|
"subHideSettings": "Sunucu ayarlarını gizle",
|
||||||
|
"subHideSettingsDesc": "VPN istemcisinde sunucu yapılandırmalarını görüntüleme ve düzenleme özelliğini gizleyin. (Yalnızca Happ için)",
|
||||||
"subClashEnableRouting": "Yönlendirmeyi Etkinleştir",
|
"subClashEnableRouting": "Yönlendirmeyi Etkinleştir",
|
||||||
"subClashEnableRoutingDesc": "Oluşturulan YAML aboneliklerine genel Clash/Mihomo yönlendirme kurallarını ekler.",
|
"subClashEnableRoutingDesc": "Oluşturulan YAML aboneliklerine genel Clash/Mihomo yönlendirme kurallarını ekler.",
|
||||||
"subClashRoutingRules": "Genel Yönlendirme Kuralları",
|
"subClashRoutingRules": "Genel Yönlendirme Kuralları",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Глобальне налаштування для увімкнення маршрутизації у VPN-клієнті. (Тільки для Happ)",
|
"subEnableRoutingDesc": "Глобальне налаштування для увімкнення маршрутизації у VPN-клієнті. (Тільки для Happ)",
|
||||||
"subRoutingRules": "Правила маршрутизації",
|
"subRoutingRules": "Правила маршрутизації",
|
||||||
"subRoutingRulesDesc": "Глобальні правила маршрутизації для VPN-клієнта. (Тільки для Happ)",
|
"subRoutingRulesDesc": "Глобальні правила маршрутизації для VPN-клієнта. (Тільки для Happ)",
|
||||||
|
"subHideSettings": "Приховати налаштування сервера",
|
||||||
|
"subHideSettingsDesc": "Приховати можливість перегляду та редагування конфігурації сервера у VPN-клієнті. (Тільки для Happ)",
|
||||||
"subClashEnableRouting": "Увімкнути маршрутизацію",
|
"subClashEnableRouting": "Увімкнути маршрутизацію",
|
||||||
"subClashEnableRoutingDesc": "Додавати глобальні правила маршрутизації Clash/Mihomo до згенерованих YAML-підписок.",
|
"subClashEnableRoutingDesc": "Додавати глобальні правила маршрутизації Clash/Mihomo до згенерованих YAML-підписок.",
|
||||||
"subClashRoutingRules": "Глобальні правила маршрутизації",
|
"subClashRoutingRules": "Глобальні правила маршрутизації",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "Cài đặt toàn cục để bật định tuyến trong ứng dụng khách VPN. (Chỉ dành cho Happ)",
|
"subEnableRoutingDesc": "Cài đặt toàn cục để bật định tuyến trong ứng dụng khách VPN. (Chỉ dành cho Happ)",
|
||||||
"subRoutingRules": "Quy tắc định tuyến",
|
"subRoutingRules": "Quy tắc định tuyến",
|
||||||
"subRoutingRulesDesc": "Quy tắc định tuyến toàn cầu cho client VPN. (Chỉ dành cho Happ)",
|
"subRoutingRulesDesc": "Quy tắc định tuyến toàn cầu cho client VPN. (Chỉ dành cho Happ)",
|
||||||
|
"subHideSettings": "Ẩn cài đặt máy chủ",
|
||||||
|
"subHideSettingsDesc": "Ẩn khả năng xem và chỉnh sửa cấu hình máy chủ trong ứng dụng khách VPN. (Chỉ dành cho Happ)",
|
||||||
"subClashEnableRouting": "Bật định tuyến",
|
"subClashEnableRouting": "Bật định tuyến",
|
||||||
"subClashEnableRoutingDesc": "Bao gồm quy tắc định tuyến Clash/Mihomo toàn cầu trong các đăng ký YAML được tạo.",
|
"subClashEnableRoutingDesc": "Bao gồm quy tắc định tuyến Clash/Mihomo toàn cầu trong các đăng ký YAML được tạo.",
|
||||||
"subClashRoutingRules": "Quy tắc định tuyến toàn cầu",
|
"subClashRoutingRules": "Quy tắc định tuyến toàn cầu",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "在 VPN 客户端中启用路由的全局设置。(僅限 Happ)",
|
"subEnableRoutingDesc": "在 VPN 客户端中启用路由的全局设置。(僅限 Happ)",
|
||||||
"subRoutingRules": "路由規則",
|
"subRoutingRules": "路由規則",
|
||||||
"subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)",
|
"subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)",
|
||||||
|
"subHideSettings": "隐藏服务器设置",
|
||||||
|
"subHideSettingsDesc": "在 VPN 客户端中隐藏查看和编辑服务器配置的功能。(僅限 Happ)",
|
||||||
"subClashEnableRouting": "启用路由",
|
"subClashEnableRouting": "启用路由",
|
||||||
"subClashEnableRoutingDesc": "在生成的 YAML 订阅中包含 Clash/Mihomo 全局路由规则。",
|
"subClashEnableRoutingDesc": "在生成的 YAML 订阅中包含 Clash/Mihomo 全局路由规则。",
|
||||||
"subClashRoutingRules": "全局路由规则",
|
"subClashRoutingRules": "全局路由规则",
|
||||||
|
|||||||
@@ -1090,6 +1090,8 @@
|
|||||||
"subEnableRoutingDesc": "在 VPN 用戶端中啟用路由的全域設定。(僅限 Happ)",
|
"subEnableRoutingDesc": "在 VPN 用戶端中啟用路由的全域設定。(僅限 Happ)",
|
||||||
"subRoutingRules": "路由規則",
|
"subRoutingRules": "路由規則",
|
||||||
"subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)",
|
"subRoutingRulesDesc": "VPN 用戶端的全域路由規則。(僅限 Happ)",
|
||||||
|
"subHideSettings": "隱藏伺服器設定",
|
||||||
|
"subHideSettingsDesc": "在 VPN 用戶端中隱藏查看和編輯伺服器配置的功能。(僅限 Happ)",
|
||||||
"subClashEnableRouting": "啟用路由",
|
"subClashEnableRouting": "啟用路由",
|
||||||
"subClashEnableRoutingDesc": "在產生的 YAML 訂閱中包含 Clash/Mihomo 全域路由規則。",
|
"subClashEnableRoutingDesc": "在產生的 YAML 訂閱中包含 Clash/Mihomo 全域路由規則。",
|
||||||
"subClashRoutingRules": "全域路由規則",
|
"subClashRoutingRules": "全域路由規則",
|
||||||
|
|||||||
Reference in New Issue
Block a user