diff options
| author | mhsanaei <ho3ein.sanaei@gmail.com> | 2024-09-09 10:46:39 +0300 |
|---|---|---|
| committer | mhsanaei <ho3ein.sanaei@gmail.com> | 2024-09-09 10:46:39 +0300 |
| commit | 58c721e7d20bb712af0d13dd2334c39fc10dbab0 (patch) | |
| tree | aa2b6706daa54301ff028a07d47ac2ed0c871eee | |
| parent | b4baf35ed8a14b58f9db6dde6a33b36d6095bcc1 (diff) | |
quic removed
| -rw-r--r-- | sub/subJsonService.go | 4 | ||||
| -rw-r--r-- | sub/subService.go | 24 | ||||
| -rw-r--r-- | web/assets/js/model/outbound.js | 14 | ||||
| -rw-r--r-- | web/assets/js/model/xray.js | 75 | ||||
| -rw-r--r-- | web/html/xui/form/outbound.html | 27 | ||||
| -rw-r--r-- | web/html/xui/form/stream/stream_quic.html | 33 | ||||
| -rw-r--r-- | web/html/xui/form/stream/stream_settings.html | 6 | ||||
| -rw-r--r-- | web/html/xui/inbound_info_modal.html | 20 | ||||
| -rw-r--r-- | web/translation/translate.en_US.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.es_ES.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.fa_IR.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.id_ID.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.pt_BR.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.ru_RU.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.tr_TR.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.uk_UA.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.vi_VN.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.zh_CN.toml | 3 |
18 files changed, 5 insertions, 228 deletions
diff --git a/sub/subJsonService.go b/sub/subJsonService.go index d1b5baaa..cbda594a 100644 --- a/sub/subJsonService.go +++ b/sub/subJsonService.go @@ -268,13 +268,13 @@ func (s *SubJsonService) realityData(rData map[string]interface{}) map[string]in rltyData["spiderX"] = "/" + random.Seq(15) shortIds, ok := rData["shortIds"].([]interface{}) if ok && len(shortIds) > 0 { - rltyData["shortId"] = shortIds + rltyData["shortId"] = shortIds[random.Num(len(shortIds))].(string) } else { rltyData["shortId"] = "" } serverNames, ok := rData["serverNames"].([]interface{}) if ok && len(serverNames) > 0 { - rltyData["serverName"] = serverNames + rltyData["serverName"] = serverNames[random.Num(len(serverNames))].(string) } else { rltyData["serverName"] = "" } diff --git a/sub/subService.go b/sub/subService.go index 2f5b2f98..33d2e065 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -213,12 +213,6 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { http, _ := stream["httpSettings"].(map[string]interface{}) obj["path"], _ = http["path"].(string) obj["host"] = searchHost(http) - case "quic": - quic, _ := stream["quicSettings"].(map[string]interface{}) - header := quic["header"].(map[string]interface{}) - obj["type"], _ = header["type"].(string) - obj["host"], _ = quic["security"].(string) - obj["path"], _ = quic["key"].(string) case "grpc": grpc, _ := stream["grpcSettings"].(map[string]interface{}) obj["path"] = grpc["serviceName"].(string) @@ -370,12 +364,6 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) params["host"] = searchHost(http) - case "quic": - quic, _ := stream["quicSettings"].(map[string]interface{}) - params["quicSecurity"] = quic["security"].(string) - params["key"] = quic["key"].(string) - header := quic["header"].(map[string]interface{}) - params["headerType"] = header["type"].(string) case "grpc": grpc, _ := stream["grpcSettings"].(map[string]interface{}) params["serviceName"] = grpc["serviceName"].(string) @@ -604,12 +592,6 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) params["host"] = searchHost(http) - case "quic": - quic, _ := stream["quicSettings"].(map[string]interface{}) - params["quicSecurity"] = quic["security"].(string) - params["key"] = quic["key"].(string) - header := quic["header"].(map[string]interface{}) - params["headerType"] = header["type"].(string) case "grpc": grpc, _ := stream["grpcSettings"].(map[string]interface{}) params["serviceName"] = grpc["serviceName"].(string) @@ -839,12 +821,6 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st http, _ := stream["httpSettings"].(map[string]interface{}) params["path"] = http["path"].(string) params["host"] = searchHost(http) - case "quic": - quic, _ := stream["quicSettings"].(map[string]interface{}) - params["quicSecurity"] = quic["security"].(string) - params["key"] = quic["key"].(string) - header := quic["header"].(map[string]interface{}) - params["headerType"] = header["type"].(string) case "grpc": grpc, _ := stream["grpcSettings"].(map[string]interface{}) params["serviceName"] = grpc["serviceName"].(string) diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js index 1ff271f2..dc22a5b1 100644 --- a/web/assets/js/model/outbound.js +++ b/web/assets/js/model/outbound.js @@ -471,7 +471,6 @@ class StreamSettings extends CommonClass { this.kcp = kcpSettings; this.ws = wsSettings; this.http = httpSettings; - this.quic = quicSettings; this.grpc = grpcSettings; this.httpupgrade = httpupgradeSettings; this.splithttp = splithttpSettings; @@ -523,7 +522,6 @@ class StreamSettings extends CommonClass { kcpSettings: network === 'kcp' ? this.kcp.toJson() : undefined, wsSettings: network === 'ws' ? this.ws.toJson() : undefined, httpSettings: network === 'http' ? this.http.toJson() : undefined, - quicSettings: network === 'quic' ? this.quic.toJson() : undefined, grpcSettings: network === 'grpc' ? this.grpc.toJson() : undefined, httpupgradeSettings: network === 'httpupgrade' ? this.httpupgrade.toJson() : undefined, splithttpSettings: network === 'splithttp' ? this.splithttp.toJson() : undefined, @@ -591,7 +589,7 @@ class Outbound extends CommonClass { canEnableTls() { if (![Protocols.VMess, Protocols.VLESS, Protocols.Trojan, Protocols.Shadowsocks].includes(this.protocol)) return false; - return ["tcp", "ws", "http", "quic", "grpc", "httpupgrade", "splithttp"].includes(this.stream.network); + return ["tcp", "ws", "http", "grpc", "httpupgrade", "splithttp"].includes(this.stream.network); } //this is used for xtls-rprx-vision @@ -707,11 +705,6 @@ class Outbound extends CommonClass { stream.http = new HttpStreamSettings( json.path, json.host); - } else if (network === 'quic') { - stream.quic = new QuicStreamSettings( - json.host ? json.host : 'none', - json.path, - json.type ? json.type : 'none'); } else if (network === 'grpc') { stream.grpc = new GrpcStreamSettings(json.path, json.authority, json.type == 'multi'); } else if (network === 'httpupgrade') { @@ -753,11 +746,6 @@ class Outbound extends CommonClass { stream.ws = new WsStreamSettings(path, host); } else if (type === 'http' || type == 'h2') { stream.http = new HttpStreamSettings(path, host); - } else if (type === 'quic') { - stream.quic = new QuicStreamSettings( - url.searchParams.get('quicSecurity') ?? 'none', - url.searchParams.get('key') ?? '', - headerType ?? 'none'); } else if (type === 'grpc') { stream.grpc = new GrpcStreamSettings( url.searchParams.get('serviceName') ?? '', diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js index a225c993..8b7fca28 100644 --- a/web/assets/js/model/xray.js +++ b/web/assets/js/model/xray.js @@ -449,37 +449,6 @@ class HttpStreamSettings extends XrayCommonClass { } } -class QuicStreamSettings extends XrayCommonClass { - constructor( - security = 'none', - key = RandomUtil.randomSeq(10), - type = 'none' - ) { - super(); - this.security = security; - this.key = key; - this.type = type; - } - - static fromJson(json = {}) { - return new QuicStreamSettings( - json.security, - json.key, - json.header ? json.header.type : 'none', - ); - } - - toJson() { - return { - security: this.security, - key: this.key, - header: { - type: this.type, - } - } - } -} - class GrpcStreamSettings extends XrayCommonClass { constructor( serviceName = "", @@ -1092,7 +1061,6 @@ class StreamSettings extends XrayCommonClass { kcpSettings = new KcpStreamSettings(), wsSettings = new WsStreamSettings(), httpSettings = new HttpStreamSettings(), - quicSettings = new QuicStreamSettings(), grpcSettings = new GrpcStreamSettings(), httpupgradeSettings = new HTTPUpgradeStreamSettings(), splithttpSettings = new SplitHTTPStreamSettings(), @@ -1109,7 +1077,6 @@ class StreamSettings extends XrayCommonClass { this.kcp = kcpSettings; this.ws = wsSettings; this.http = httpSettings; - this.quic = quicSettings; this.grpc = grpcSettings; this.httpupgrade = httpupgradeSettings; this.splithttp = splithttpSettings; @@ -1173,7 +1140,6 @@ class StreamSettings extends XrayCommonClass { KcpStreamSettings.fromJson(json.kcpSettings), WsStreamSettings.fromJson(json.wsSettings), HttpStreamSettings.fromJson(json.httpSettings), - QuicStreamSettings.fromJson(json.quicSettings), GrpcStreamSettings.fromJson(json.grpcSettings), HTTPUpgradeStreamSettings.fromJson(json.httpupgradeSettings), SplitHTTPStreamSettings.fromJson(json.splithttpSettings), @@ -1194,7 +1160,6 @@ class StreamSettings extends XrayCommonClass { kcpSettings: network === 'kcp' ? this.kcp.toJson() : undefined, wsSettings: network === 'ws' ? this.ws.toJson() : undefined, httpSettings: network === 'http' ? this.http.toJson() : undefined, - quicSettings: network === 'quic' ? this.quic.toJson() : undefined, grpcSettings: network === 'grpc' ? this.grpc.toJson() : undefined, httpupgradeSettings: network === 'httpupgrade' ? this.httpupgrade.toJson() : undefined, splithttpSettings: network === 'splithttp' ? this.splithttp.toJson() : undefined, @@ -1311,10 +1276,6 @@ class Inbound extends XrayCommonClass { return this.network === "kcp"; } - get isQuic() { - return this.network === "quic" - } - get isGrpc() { return this.network === "grpc"; } @@ -1393,18 +1354,6 @@ class Inbound extends XrayCommonClass { return null; } - get quicSecurity() { - return this.stream.quic.security; - } - - get quicKey() { - return this.stream.quic.key; - } - - get quicType() { - return this.stream.quic.type; - } - get kcpType() { return this.stream.kcp.type; } @@ -1424,7 +1373,7 @@ class Inbound extends XrayCommonClass { canEnableTls() { if (![Protocols.VMESS, Protocols.VLESS, Protocols.TROJAN, Protocols.SHADOWSOCKS].includes(this.protocol)) return false; - return ["tcp", "ws", "http", "quic", "grpc", "httpupgrade", "splithttp"].includes(this.network); + return ["tcp", "ws", "http", "grpc", "httpupgrade", "splithttp"].includes(this.network); } //this is used for xtls-rprx-vision @@ -1497,10 +1446,6 @@ class Inbound extends XrayCommonClass { obj.net = 'h2'; obj.path = this.stream.http.path; obj.host = this.stream.http.host.join(','); - } else if (network === 'quic') { - obj.type = this.stream.quic.type; - obj.host = this.stream.quic.security; - obj.path = this.stream.quic.key; } else if (network === 'grpc') { obj.path = this.stream.grpc.serviceName; obj.authority = this.stream.grpc.authority; @@ -1570,12 +1515,6 @@ class Inbound extends XrayCommonClass { params.set("path", http.path); params.set("host", http.host); break; - case "quic": - const quic = this.stream.quic; - params.set("quicSecurity", quic.security); - params.set("key", quic.key); - params.set("headerType", quic.type); - break; case "grpc": const grpc = this.stream.grpc; params.set("serviceName", grpc.serviceName); @@ -1691,12 +1630,6 @@ class Inbound extends XrayCommonClass { params.set("path", http.path); params.set("host", http.host); break; - case "quic": - const quic = this.stream.quic; - params.set("quicSecurity", quic.security); - params.set("key", quic.key); - params.set("headerType", quic.type); - break; case "grpc": const grpc = this.stream.grpc; params.set("serviceName", grpc.serviceName); @@ -1779,12 +1712,6 @@ class Inbound extends XrayCommonClass { params.set("path", http.path); params.set("host", http.host); break; - case "quic": - const quic = this.stream.quic; - params.set("quicSecurity", quic.security); - params.set("key", quic.key); - params.set("headerType", quic.type); - break; case "grpc": const grpc = this.stream.grpc; params.set("serviceName", grpc.serviceName); diff --git a/web/html/xui/form/outbound.html b/web/html/xui/form/outbound.html index 7dbd0313..081c6fd7 100644 --- a/web/html/xui/form/outbound.html +++ b/web/html/xui/form/outbound.html @@ -239,7 +239,6 @@ <a-select-option value="kcp">mKCP</a-select-option> <a-select-option value="ws">WebSocket</a-select-option> <a-select-option value="http">H2</a-select-option> - <a-select-option value="quic">QUIC</a-select-option> <a-select-option value="grpc">gRPC</a-select-option> <a-select-option value="httpupgrade">HTTPUpgrade</a-select-option> <a-select-option value="splithttp">SplitHTTP</a-select-option> @@ -317,31 +316,7 @@ <a-input v-model.trim="outbound.stream.http.path"></a-input> </a-form-item> </template> - - <!-- quic --> - <template v-if="outbound.stream.network === 'quic'"> - <a-form-item label='{{ i18n "pages.inbounds.stream.quic.encryption" }}'> - <a-select v-model="outbound.stream.quic.security" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option value="none">None</a-select-option> - <a-select-option value="aes-128-gcm">AES-128-GCM</a-select-option> - <a-select-option value="chacha20-poly1305">CHACHA20-POLY1305</a-select-option> - </a-select> - </a-form-item> - <a-form-item label='{{ i18n "password" }}'> - <a-input v-model.trim="outbound.stream.quic.key"></a-input> - </a-form-item> - <a-form-item label='{{ i18n "camouflage" }}'> - <a-select v-model="outbound.stream.quic.type" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option value="none">None</a-select-option> - <a-select-option value="srtp">SRTP</a-select-option> - <a-select-option value="utp">uTP</a-select-option> - <a-select-option value="wechat-video">WeChat</a-select-option> - <a-select-option value="dtls">DTLS 1.2</a-select-option> - <a-select-option value="wireguard">WireGuard</a-select-option> - </a-select> - </a-form-item> - </template> - + <!-- grpc --> <template v-if="outbound.stream.network === 'grpc'"> <a-form-item label='Service Name'> diff --git a/web/html/xui/form/stream/stream_quic.html b/web/html/xui/form/stream/stream_quic.html deleted file mode 100644 index c7c5800a..00000000 --- a/web/html/xui/form/stream/stream_quic.html +++ /dev/null @@ -1,33 +0,0 @@ -{{define "form/streamQUIC"}} -<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> - <a-form-item label='{{ i18n "pages.inbounds.stream.quic.encryption" }}'> - <a-select v-model="inbound.stream.quic.security" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option value="none">None</a-select-option> - <a-select-option value="aes-128-gcm">AES-128-GCM</a-select-option> - <a-select-option value="chacha20-poly1305">CHACHA20-POLY1305</a-select-option> - </a-select> - </a-form-item> - <a-form-item> - <template slot="label"> - <a-tooltip> - <template slot="title"> - <span>{{ i18n "reset" }}</span> - </template> - {{ i18n "password" }} - <a-icon @click="inbound.stream.quic.key = RandomUtil.randomSeq(10)"type="sync"> </a-icon> - </a-tooltip> - </template> - <a-input v-model.trim="inbound.stream.quic.key"></a-input> - </a-form-item> - <a-form-item label='{{ i18n "camouflage" }}'> - <a-select v-model="inbound.stream.quic.type" style="width: 50%" :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option value="none">None</a-select-option> - <a-select-option value="srtp">SRTP</a-select-option> - <a-select-option value="utp">uTP</a-select-option> - <a-select-option value="wechat-video">WeChat</a-select-option> - <a-select-option value="dtls">DTLS 1.2</a-select-option> - <a-select-option value="wireguard">WireGuard</a-select-option> - </a-select> - </a-form-item> -</a-form> -{{end}} diff --git a/web/html/xui/form/stream/stream_settings.html b/web/html/xui/form/stream/stream_settings.html index f6fe6f23..debc38de 100644 --- a/web/html/xui/form/stream/stream_settings.html +++ b/web/html/xui/form/stream/stream_settings.html @@ -8,7 +8,6 @@ <a-select-option value="kcp">mKCP</a-select-option> <a-select-option value="ws">WebSocket</a-select-option> <a-select-option value="http">H2</a-select-option> - <a-select-option value="quic">QUIC</a-select-option> <a-select-option value="grpc">gRPC</a-select-option> <a-select-option value="httpupgrade">HTTPUpgrade</a-select-option> <a-select-option value="splithttp">SplitHTTP</a-select-option> @@ -36,11 +35,6 @@ {{template "form/streamHTTP"}} </template> -<!-- quic --> -<template v-if="inbound.stream.network === 'quic'"> - {{template "form/streamQUIC"}} -</template> - <!-- grpc --> <template v-if="inbound.stream.network === 'grpc'"> {{template "form/streamGRPC"}} diff --git a/web/html/xui/inbound_info_modal.html b/web/html/xui/inbound_info_modal.html index e5dbda42..51efa308 100644 --- a/web/html/xui/inbound_info_modal.html +++ b/web/html/xui/inbound_info_modal.html @@ -58,26 +58,6 @@ </td> </tr> </template> - <template v-if="inbound.isQuic"> - <tr> - <td>quic {{ i18n "encryption" }}</td> - <td> - <a-tag>[[ inbound.quicSecurity ]]</a-tag> - </td> - </tr> - <tr> - <td>quic {{ i18n "password" }}</td> - <td> - <a-tag>[[ inbound.quicKey ]]</a-tag> - </td> - </tr> - <tr> - <td>quic {{ i18n "camouflage" }}</td> - <td> - <a-tag>[[ inbound.quicType ]]</a-tag> - </td> - </tr> - </template> <template v-if="inbound.isKcp"> <tr> <td>kcp {{ i18n "encryption" }}</td> diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 290feae4..dc301275 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -225,9 +225,6 @@ "requestHeader" = "Request Header" "responseHeader" = "Response Header" -[pages.inbounds.stream.quic] -"encryption" = "Encryption" - [pages.settings] "title" = "Panel Settings" "save" = "Save" diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index adb52271..f727548e 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -225,9 +225,6 @@ "requestHeader" = "Encabezado de solicitud"
"responseHeader" = "Encabezado de respuesta"
-[pages.inbounds.stream.quic]
-"encryption" = "Cifrado"
-
[pages.settings]
"title" = "Configuraciones"
"save" = "Guardar"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index 1258ba41..5ccfbfe5 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -225,9 +225,6 @@ "requestHeader" = "سربرگ درخواست" "responseHeader" = "سربرگ پاسخ" -[pages.inbounds.stream.quic] -"encryption" = "رمزنگاری" - [pages.settings] "title" = "تنظیمات پنل" "save" = "ذخیره" diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index f88610c1..cd03c4e6 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -225,9 +225,6 @@ "requestHeader" = "Header Permintaan" "responseHeader" = "Header Respons" -[pages.inbounds.stream.quic] -"encryption" = "Enkripsi" - [pages.settings] "title" = "Pengaturan Panel" "save" = "Simpan" diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml index 411dde76..1c44a4f2 100644 --- a/web/translation/translate.pt_BR.toml +++ b/web/translation/translate.pt_BR.toml @@ -225,9 +225,6 @@ "requestHeader" = "Cabeçalho da Requisição" "responseHeader" = "Cabeçalho da Resposta" -[pages.inbounds.stream.quic] -"encryption" = "Criptografia" - [pages.settings] "title" = "Configurações do Painel" "save" = "Salvar" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index 93d8b3fe..8ef6ae9c 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -225,9 +225,6 @@ "requestHeader" = "Заголовок запроса" "responseHeader" = "Заголовок ответа" -[pages.inbounds.stream.quic] -"encryption" = "Шифрование" - [pages.settings] "title" = "Настройки" "save" = "Сохранить" diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml index 7006462f..e0428a6e 100644 --- a/web/translation/translate.tr_TR.toml +++ b/web/translation/translate.tr_TR.toml @@ -225,9 +225,6 @@ "requestHeader" = "İstek Başlığı" "responseHeader" = "Yanıt Başlığı" -[pages.inbounds.stream.quic] -"encryption" = "Şifreleme" - [pages.settings] "title" = "Panel Ayarları" "save" = "Kaydet" diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml index f15a36bb..2149abc5 100644 --- a/web/translation/translate.uk_UA.toml +++ b/web/translation/translate.uk_UA.toml @@ -225,9 +225,6 @@ "requestHeader" = "Заголовок запиту" "responseHeader" = "Заголовок відповіді" -[pages.inbounds.stream.quic] -"encryption" = "Шифрування" - [pages.settings] "title" = "Параметри панелі" "save" = "Зберегти" diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index 6024fe2b..7ee473a5 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -225,9 +225,6 @@ "requestHeader" = "Header yêu cầu"
"responseHeader" = "Header phản hồi"
-[pages.inbounds.stream.quic]
-"encryption" = "Mã hóa"
-
[pages.settings]
"title" = "Cài đặt"
"save" = "Lưu"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml index 480dec95..ea9e2afd 100644 --- a/web/translation/translate.zh_CN.toml +++ b/web/translation/translate.zh_CN.toml @@ -225,9 +225,6 @@ "requestHeader" = "请求头" "responseHeader" = "响应头" -[pages.inbounds.stream.quic] -"encryption" = "加密" - [pages.settings] "title" = "面板设置" "save" = "保存" |
