diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2024-02-21 13:47:52 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2024-02-21 13:47:52 +0300 |
| commit | 03b7a3479394f54a2e793f23f35e0f2b8a4b4a6a (patch) | |
| tree | 72e4bd1e7201f90bc118b8ee0f2bc86d4718bb97 /web | |
| parent | f3eb4f055db80372298d60c073870a5af1431785 (diff) | |
[sub] json + fragment
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web')
| -rw-r--r-- | web/assets/js/model/setting.js | 3 | ||||
| -rw-r--r-- | web/controller/xray_setting.go | 1 | ||||
| -rw-r--r-- | web/entity/entity.go | 10 | ||||
| -rw-r--r-- | web/html/common/qrcode_modal.html | 24 | ||||
| -rw-r--r-- | web/html/xui/inbound_info_modal.html | 17 | ||||
| -rw-r--r-- | web/html/xui/inbounds.html | 23 | ||||
| -rw-r--r-- | web/html/xui/settings.html | 96 | ||||
| -rw-r--r-- | web/service/setting.go | 45 | ||||
| -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.ru_RU.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.vi_VN.toml | 3 | ||||
| -rw-r--r-- | web/translation/translate.zh_Hans.toml | 3 |
15 files changed, 190 insertions, 50 deletions
diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js index ddf1a0e1..637830e8 100644 --- a/web/assets/js/model/setting.js +++ b/web/assets/js/model/setting.js @@ -28,6 +28,7 @@ class AllSetting { this.subListen = ""; this.subPort = "2096"; this.subPath = "/sub/"; + this.subJsonPath = "/json/"; this.subDomain = ""; this.subCertFile = ""; this.subKeyFile = ""; @@ -35,6 +36,8 @@ class AllSetting { this.subEncrypt = true; this.subShowInfo = false; this.subURI = ''; + this.subJsonURI = ''; + this.subJsonFragment = ''; this.timeLocation = "Asia/Tehran"; diff --git a/web/controller/xray_setting.go b/web/controller/xray_setting.go index 28f55b54..2dddb44b 100644 --- a/web/controller/xray_setting.go +++ b/web/controller/xray_setting.go @@ -81,7 +81,6 @@ func (a *XraySettingController) warp(c *gin.Context) { resp, err = a.XraySettingService.RegWarp(skey, pkey) case "license": license := c.PostForm("license") - println(license) resp, err = a.XraySettingService.SetWarpLicence(license) } diff --git a/web/entity/entity.go b/web/entity/entity.go index 8ab06399..06850128 100644 --- a/web/entity/entity.go +++ b/web/entity/entity.go @@ -48,6 +48,9 @@ type AllSetting struct { SubEncrypt bool `json:"subEncrypt" form:"subEncrypt"` SubShowInfo bool `json:"subShowInfo" form:"subShowInfo"` SubURI string `json:"subURI" form:"subURI"` + SubJsonPath string `json:"subJsonPath" form:"subJsonPath"` + SubJsonURI string `json:"subJsonURI" form:"subJsonURI"` + SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"` Datepicker string `json:"datepicker" form:"datepicker"` } @@ -105,6 +108,13 @@ func (s *AllSetting) CheckValid() error { s.SubPath += "/" } + if !strings.HasPrefix(s.SubJsonPath, "/") { + s.SubJsonPath = "/" + s.SubJsonPath + } + if !strings.HasSuffix(s.SubJsonPath, "/") { + s.SubJsonPath += "/" + } + _, err := time.LoadLocation(s.TimeLocation) if err != nil { return common.NewError("time location not exist:", s.TimeLocation) diff --git a/web/html/common/qrcode_modal.html b/web/html/common/qrcode_modal.html index 3bda4c29..7cc317ef 100644 --- a/web/html/common/qrcode_modal.html +++ b/web/html/common/qrcode_modal.html @@ -8,13 +8,23 @@ {{ i18n "pages.inbounds.clickOnQRcode" }} </a-tag> <template v-if="app.subSettings.enable && qrModal.subId"> - <a-divider>Subscription</a-divider> - <div class="qr-bg"><canvas @click="copyToClipboard('qrCode-sub',genSubLink(qrModal.client.subId))" id="qrCode-sub" style="width: 100%; height: 100%;"></canvas></div> + <a-divider>{{ i18n "pages.settings.subSettings"}}</a-divider> + <canvas @click="copyToClipboard('qrCode-sub',genSubLink(qrModal.client.subId))" + id="qrCode-sub" + style="width: 100%; height: 100%; display: flex; border-radius: 1rem;"> + </canvas> + <a-divider>{{ i18n "pages.settings.subSettings"}} Json</a-divider> + <canvas @click="copyToClipboard('qrCode-subJson',genSubJsonLink(qrModal.client.subId))" + id="qrCode-subJson" + style="width: 100%; height: 100%; display: flex; border-radius: 1rem;"> + </canvas> </template> <a-divider>{{ i18n "pages.inbounds.client" }}</a-divider> <template v-for="(row, index) in qrModal.qrcodes"> - <a-tag color="green" style="margin: 10px 0; display: block; text-align: center;">[[ row.remark ]]</a-tag> - <div class="qr-bg"><canvas @click="copyToClipboard('qrCode-'+index, row.link)" :id="'qrCode-'+index" style="width: 100%; height: 100%;"></canvas></div> + <a-tag color="blue" style="margin: 10px 0; display: block; text-align: center;">[[ row.remark ]]</a-tag> + <canvas @click="copyToClipboard('qrCode-'+index, row.link)" + :id="'qrCode-'+index" + style="width: 100%; height: 100%; display: flex; border-radius: 1rem;"></canvas> </template> </a-modal> @@ -82,12 +92,16 @@ }, genSubLink(subID) { return app.subSettings.subURI+subID; + }, + genSubJsonLink(subID) { + return app.subSettings.subJsonURI+subID; } }, updated() { if (qrModal.client && qrModal.client.subId) { qrModal.subId = qrModal.client.subId; this.setQrCode("qrCode-sub", this.genSubLink(qrModal.subId)); + this.setQrCode("qrCode-subJson", this.genSubJsonLink(qrModal.subId)); } qrModal.qrcodes.forEach((element, index) => { this.setQrCode("qrCode-" + index, element.link); @@ -96,4 +110,4 @@ }); </script> -{{end}} +{{end}}
\ No newline at end of file diff --git a/web/html/xui/inbound_info_modal.html b/web/html/xui/inbound_info_modal.html index 23f8bd47..c8341651 100644 --- a/web/html/xui/inbound_info_modal.html +++ b/web/html/xui/inbound_info_modal.html @@ -166,7 +166,7 @@ <template v-if="app.subSettings.enable && infoModal.clientSettings.subId"> <a-divider>Subscription URL</a-divider> <a-row> - <a-col :sx="24" :md="22"><a :href="[[ infoModal.subLink ]]" target="_blank">[[ infoModal.subLink ]]</a></a-col> + <a-col :sx="24" :md="22">SUB: <a :href="[[ infoModal.subLink ]]" target="_blank">[[ infoModal.subLink ]]</a></a-col> <a-col :sx="24" :md="2" style="text-align: right;"> <a-tooltip title='{{ i18n "copy" }}'> <button class="ant-btn ant-btn-primary" id="copy-sub-link" @click="copyToClipboard('copy-sub-link', infoModal.subLink)"> @@ -175,6 +175,16 @@ </a-tooltip> </a-col> </a-row> + <a-row> + <a-col :sx="24" :md="22">JSON: <a :href="[[ infoModal.subJsonLink ]]" target="_blank">[[ infoModal.subJsonLink ]]</a></a-col> + <a-col :sx="24" :md="2" style="text-align: right; margin-top: 5px;"> + <a-tooltip title='{{ i18n "copy" }}'> + <button class="ant-btn ant-btn-primary" id="copy-subJson-link" @click="copyToClipboard('copy-subJson-link', infoModal.subJsonLink)"> + <a-icon type="snippets"></a-icon> + </button> + </a-tooltip> + </a-col> + </a-row> </template> <template v-if="app.tgBotEnable && infoModal.clientSettings.tgId"> <a-divider>Telegram ID</a-divider> @@ -345,6 +355,7 @@ index: null, isExpired: false, subLink: '', + subJsonLink: '', show(dbInbound, index) { this.index = index; this.inbound = dbInbound.toInbound(); @@ -360,6 +371,7 @@ if (this.clientSettings) { if (this.clientSettings.subId) { this.subLink = this.genSubLink(this.clientSettings.subId); + this.subJsonLink = this.genSubJsonLink(this.clientSettings.subId); } } this.visible = true; @@ -369,6 +381,9 @@ }, genSubLink(subID) { return app.subSettings.subURI+subID; + }, + genSubJsonLink(subID) { + return app.subSettings.subJsonURI+subID; } }; diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html index f1f14275..a2365cde 100644 --- a/web/html/xui/inbounds.html +++ b/web/html/xui/inbounds.html @@ -65,11 +65,6 @@ </a-alert> </transition> <transition name="list" appear> - <a-tag v-if="false" color="red" style="margin-bottom: 10px"> - Please go to the panel settings as soon as possible to modify the username and password, otherwise there may be a risk of leaking account information - </a-tag> - </transition> - <transition name="list" appear> <a-card hoverable> <a-row> <a-col :xs="24" :sm="24" :lg="12"> @@ -576,7 +571,8 @@ refreshInterval: Number(localStorage.getItem("refreshInterval")) || 5000, subSettings: { enable : false, - subURI : '' + subURI : '', + subJsonURI : '', }, remarkModel: '-ieo', datepicker: 'gregorian', @@ -623,7 +619,8 @@ this.tgBotEnable = tgBotEnable; this.subSettings = { enable : subEnable, - subURI: subURI + subURI: subURI, + subJsonURI: subJsonURI }; this.pageSize = pageSize; this.remarkModel = remarkModel; @@ -997,7 +994,7 @@ }, delInbound(dbInboundId) { this.$confirm({ - title: '{{ i18n "pages.inbounds.deleteInbound"}}', + title: '{{ i18n "pages.inbounds.deleteInbound"}}' + ' #' + dbInboundId, content: '{{ i18n "pages.inbounds.deleteInboundContent"}}', class: themeSwitcher.currentTheme, okText: '{{ i18n "delete"}}', @@ -1010,7 +1007,7 @@ clientId = this.getClientId(dbInbound.protocol, client); if (confirmation){ this.$confirm({ - title: '{{ i18n "pages.inbounds.deleteClient"}}', + title: '{{ i18n "pages.inbounds.deleteClient"}}' + ' ' + client.email, content: '{{ i18n "pages.inbounds.deleteClientContent"}}', class: themeSwitcher.currentTheme, okText: '{{ i18n "delete"}}', @@ -1301,7 +1298,7 @@ pagination(obj){ if (this.pageSize > 0 && obj.length>this.pageSize) { // Set page options based on object size - sizeOptions = [] + sizeOptions = []; for (i=this.pageSize;i<=obj.length;i=i+this.pageSize) { sizeOptions.push(i.toString()); } @@ -1314,8 +1311,8 @@ position: 'bottom', pageSize: this.pageSize, pageSizeOptions: sizeOptions - } - return p + }; + return p; } return false }, @@ -1369,7 +1366,6 @@ } }, }); - </script> {{template "inboundModal"}} @@ -1379,6 +1375,5 @@ {{template "inboundInfoModal"}} {{template "clientsModal"}} {{template "clientsBulkModal"}} - </body> </html> diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html index a7c72f73..c6edc506 100644 --- a/web/html/xui/settings.html +++ b/web/html/xui/settings.html @@ -83,7 +83,17 @@ show-icon closable > </a-alert> - </transition> + <a-alert type="error" v-if="confAlerts.length>0" style="margin-bottom: 10px" + message='{{ i18n "secAlertTitle" }}' + color="red" + show-icon closable + > + <template slot="description"> + {{ i18n "secAlertConf" }} + <li v-for="a in confAlerts">- [[ a ]]</li> + </template> + </a-alert> + </transition> <a-space direction="vertical"> <a-card hoverable style="margin-bottom: .5rem; overflow-x: hidden;"> <a-row style="display: flex; flex-wrap: wrap; align-items: center;"> @@ -93,9 +103,7 @@ <a-button type="danger" :disabled="!saveBtnDisable" @click="restartPanel">{{ i18n "pages.settings.restartPanel" }}</a-button> </a-space> </a-col> - <a-col :xs="24" :sm="14"> - <template> - <div> + <a-col :xs="24" :sm="16"> <template> <div> <a-back-top :target="() => document.getElementById('content-layout')" visibility-height="200"> @@ -104,8 +112,6 @@ message='{{ i18n "pages.settings.infoDesc" }}' show-icon > - </div> - </template> </div> </template> </a-col> @@ -173,7 +179,6 @@ <a-col :lg="24" :xl="12"> <a-list-item-meta title="Language" /> </a-col> - <a-col :lg="24" :xl="12"> <template> <a-select @@ -243,7 +248,6 @@ <a-button type="primary" :loading="this.changeSecret" @click="updateSecret">{{ i18n "confirm" }}</a-button> </a-form> </a-tab-pane> - <a-tab-pane key="3" tab='{{ i18n "pages.settings.TGBotSettings"}}'> <a-list item-layout="horizontal"> <setting-list-item type="switch" title='{{ i18n "pages.settings.telegramBotEnable" }}' desc='{{ i18n "pages.settings.telegramBotEnableDesc" }}' v-model="allSetting.tgBotEnable"></setting-list-item> @@ -266,8 +270,7 @@ ref="selectBotLang" v-model="allSetting.tgLang" :dropdown-class-name="themeSwitcher.currentTheme" - style="width: 100%" - > + style="width: 100%"> <a-select-option :value="l.value" :label="l.value" v-for="l in supportLangs"> <span role="img" :aria-label="l.name" v-text="l.icon"></span> <span v-text="l.name"></span> @@ -294,6 +297,17 @@ <setting-list-item type="number" title='{{ i18n "pages.settings.subUpdates"}}' desc='{{ i18n "pages.settings.subUpdatesDesc"}}' v-model="allSetting.subUpdates"></setting-list-item> </a-list> </a-tab-pane> + <a-tab-pane key="5" tab='{{ i18n "pages.settings.subSettings" }} Json' v-if="allSetting.subEnable"> + <a-list item-layout="horizontal"> + <setting-list-item type="text" title='{{ i18n "pages.settings.subPath"}}' desc='{{ i18n "pages.settings.subPathDesc"}}' v-model="allSetting.subJsonPath"></setting-list-item> + <setting-list-item type="text" title='{{ i18n "pages.settings.subURI"}}' desc='{{ i18n "pages.settings.subURIDesc"}}' v-model="allSetting.subJsonURI" placeholder="(http|https)://domain[:port]/path/"></setting-list-item> + <setting-list-item type="switch" title='{{ i18n "pages.settings.fragment"}}' desc='{{ i18n "pages.settings.fragmentDesc"}}' v-model="fragment"></setting-list-item> + <template v-if="fragment"> + <setting-list-item type="text" title='length' v-model="fragmentLength" placeholder="100-200"></setting-list-item> + <setting-list-item type="text" title='Interval' v-model="fragmentInterval" placeholder="10-20"></setting-list-item> + </template> + </a-list> + </a-tab-pane> </a-tabs> </a-space> </a-spin> @@ -324,6 +338,24 @@ remarkSeparators: [' ','-','_','@',':','~','|',',','.','/'], datepickerList: [{name:'Gregorian (Standard)', value: 'gregorian'}, {name:'Jalalian (شمسی)', value: 'jalalian'}], remarkSample: '', + defaultFragment: { + tag: "fragment", + protocol: "freedom", + settings: { + domainStrategy: "AsIs", + fragment: { + packets: "tlshello", + length: "100-200", + interval: "10-20" + } + }, + streamSettings: { + sockopt: { + tcpKeepAliveIdle: 100, + TcpNoDelay: true + } + } + }, get remarkModel() { rm = this.allSetting.remarkModel; return rm.length>1 ? rm.substring(1).split('') : []; @@ -452,6 +484,50 @@ } }, }, + computed: { + fragment: { + get: function() { return this.allSetting?.subJsonFragment != ""; }, + set: function (v) { + this.allSetting.subJsonFragment = v ? JSON.stringify(this.defaultFragment) : ""; + } + }, + fragmentLength: { + get: function() { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.length : ""; }, + set: function(v) { + if (v != ""){ + newFragment = JSON.parse(this.allSetting.subJsonFragment); + newFragment.settings.fragment.length = v; + this.allSetting.subJsonFragment = JSON.stringify(newFragment); + } + } + }, + fragmentInterval: { + get: function() { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.interval : ""; }, + set: function(v) { + if (v != ""){ + newFragment = JSON.parse(this.allSetting.subJsonFragment); + newFragment.settings.fragment.interval = v; + this.allSetting.subJsonFragment = JSON.stringify(newFragment); + } + } + }, + confAlerts: { + get: function() { + if (!this.allSetting) return []; + var alerts = [] + if (this.allSetting.port == 54321) alerts.push('{{ i18n "pages.settings.panelPort"}}'); + panelPath = window.location.pathname.split('/').length<4 + if (panelPath && this.allSetting.webBasePath == '/') alerts.push('{{ i18n "pages.settings.panelSettings"}} {{ i18n "pages.settings.panelUrlPath"}}'); + if (this.allSetting.subEnable) { + subPath = this.allSetting.subURI.length >0 ? new URL(this.allSetting.subURI).pathname : this.allSetting.subPath; + if (subPath == '/sub/') alerts.push('{{ i18n "pages.settings.subSettings"}} {{ i18n "pages.settings.subPath"}}'); + subJsonPath = this.allSetting.subJsonURI.length >0 ? new URL(this.allSetting.subJsonURI).pathname : this.allSetting.subJsonPath; + if (subJsonPath == '/json/') alerts.push('JSON {{ i18n "pages.settings.subPath"}}'); + } + return alerts + } + } + }, async mounted() { if (window.location.protocol !== "https:") { this.showAlert = true; diff --git a/web/service/setting.go b/web/service/setting.go index 89c78662..3c7b18fe 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -57,6 +57,9 @@ var defaultValueMap = map[string]string{ "subEncrypt": "true", "subShowInfo": "true", "subURI": "", + "subJsonPath": "/json/", + "subJsonURI": "", + "subJsonFragment": "", "datepicker": "gregorian", "warp": "", } @@ -387,17 +390,11 @@ func (s *SettingService) GetSubPort() (int, error) { } func (s *SettingService) GetSubPath() (string, error) { - subPath, err := s.getString("subPath") - if err != nil { - return "", err - } - if !strings.HasPrefix(subPath, "/") { - subPath = "/" + subPath - } - if !strings.HasSuffix(subPath, "/") { - subPath += "/" - } - return subPath, nil + return s.getString("subPath") +} + +func (s *SettingService) GetSubJsonPath() (string, error) { + return s.getString("subJsonPath") } func (s *SettingService) GetSubDomain() (string, error) { @@ -412,8 +409,8 @@ func (s *SettingService) GetSubKeyFile() (string, error) { return s.getString("subKeyFile") } -func (s *SettingService) GetSubUpdates() (int, error) { - return s.getInt("subUpdates") +func (s *SettingService) GetSubUpdates() (string, error) { + return s.getString("subUpdates") } func (s *SettingService) GetSubEncrypt() (bool, error) { @@ -432,6 +429,14 @@ func (s *SettingService) GetSubURI() (string, error) { return s.getString("subURI") } +func (s *SettingService) GetSubJsonURI() (string, error) { + return s.getString("subJsonURI") +} + +func (s *SettingService) GetSubJsonFragment() (string, error) { + return s.getString("subJsonFragment") +} + func (s *SettingService) GetDatepicker() (string, error) { return s.getString("datepicker") } @@ -484,6 +489,7 @@ func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { "tgBotEnable": func() (interface{}, error) { return s.GetTgbotenabled() }, "subEnable": func() (interface{}, error) { return s.GetSubEnable() }, "subURI": func() (interface{}, error) { return s.GetSubURI() }, + "subJsonURI": func() (interface{}, error) { return s.GetSubJsonURI() }, "remarkModel": func() (interface{}, error) { return s.GetRemarkModel() }, "datepicker": func() (interface{}, error) { return s.GetDatepicker() }, } @@ -498,10 +504,11 @@ func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { result[key] = value } - if result["subEnable"].(bool) && result["subURI"].(string) == "" { + if result["subEnable"].(bool) && (result["subURI"].(string) == "" || result["subJsonURI"].(string) == "") { subURI := "" subPort, _ := s.GetSubPort() subPath, _ := s.GetSubPath() + subJsonPath, _ := s.GetSubJsonPath() subDomain, _ := s.GetSubDomain() subKeyFile, _ := s.GetSubKeyFile() subCertFile, _ := s.GetSubCertFile() @@ -522,12 +529,12 @@ func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { } else { subURI += fmt.Sprintf("%s:%d", subDomain, subPort) } - if subPath[0] == byte('/') { - subURI += subPath - } else { - subURI += "/" + subPath + if result["subURI"].(string) == "" { + result["subURI"] = subURI + subPath + } + if result["subJsonURI"].(string) == "" { + result["subJsonURI"] = subURI + subJsonPath } - result["subURI"] = subURI } return result, nil diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 4c642396..3291cd83 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -54,6 +54,7 @@ "security" = "Security" "secAlertTitle" = "Security Alert" "secAlertSsl" = "This connection is not secure. Please avoid entering sensitive information until TLS is activated for data protection." +"secAlertConf" = "Certain configurations have been identified as susceptible to attacks, prompting immediate action to reinforce security protocols and safeguard against potential security breaches." [menu] "dashboard" = "Overview" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "The remaining traffic and date will be displayed in the client apps." "subURI" = "Reverse Proxy URI" "subURIDesc" = "The URI path of the subscription URL for use behind proxies." +"fragment" = "Fragmentation" +"fragmentDesc" = "Enable fragmentation for TLS hello packet" [pages.xray] "title" = "Xray Configs" diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index 23667a2d..11002900 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -54,6 +54,7 @@ "security" = "Seguridad" "secAlertTitle" = "Alerta de seguridad" "secAlertSsl" = "Esta conexión no es segura. Evite ingresar información confidencial hasta que TLS esté activado para la protección de datos." +"secAlertConf" = "Se han identificado ciertas configuraciones como susceptibles a ataques, lo que genera acciones inmediatas para reforzar los protocolos de seguridad y proteger contra posibles violaciones de seguridad." [menu] "dashboard" = "Estado del Sistema" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "Mostrar tráfico restante y fecha después del nombre de configuración." "subURI" = "URI de proxy inverso" "subURIDesc" = "Cambiar el URI base de la URL de suscripción para usar detrás de los servidores proxy" +"fragment" = "Fragmentación" +"fragmentDesc" = "Habilitar la fragmentación para el paquete de saludo TLS" [pages.xray] "title" = "Xray Configuración" diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index 7d2780d2..d28c9ef1 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -54,6 +54,7 @@ "security" = "امنیت" "secAlertTitle" = "هشدارامنیتی" "secAlertSsl" = "ایناتصالامن نیست. لطفا تازمانیکه تیالاس برای محافظت از دادهها فعال نشدهاست، از وارد کردن اطلاعات حساس خودداری کنید" +"secAlertConf" = "پیکربندیهای خاصی مستعد حملات سایبری شناسایی شدهاند، اقدام فوری برای تقویت پروتکلهای امنیتی و محافظت در برابر نقضهای امنیتی لازم است" [menu] "dashboard" = "نمای کلی" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد" "subURI" = "پروکسی معکوس URI مسیر" "subURIDesc" = "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر" +"fragment" = "تکهتکه شدن" +"fragmentDesc" = "فعال کردن تکه تکه شدن برای بسته نخست تیالاس" [pages.xray] "title" = "پیکربندی ایکسری" diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index 3c7881d0..238c44b6 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -54,6 +54,7 @@ "security" = "Keamanan" "secAlertTitle" = "Peringatan keamanan" "secAlertSsl" = "Koneksi ini tidak aman. Harap hindari memasukkan informasi sensitif sampai TLS diaktifkan untuk perlindungan data." +"secAlertConf" = "Konfigurasi tertentu telah diidentifikasi rentan terhadap serangan, sehingga mendorong tindakan segera untuk memperkuat protokol keamanan dan melindungi dari potensi pelanggaran keamanan." [menu] "dashboard" = "Ikhtisar" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "Sisa traffic dan tanggal akan ditampilkan di aplikasi klien." "subURI" = "URI Proxy Terbalik" "subURIDesc" = "URI path URL langganan untuk penggunaan di belakang proxy." +"fragment" = "Fragmentasi" +"fragmentDesc" = "Aktifkan fragmentasi untuk paket hello TLS" [pages.xray] "title" = "Konfigurasi Xray" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index c75a25b8..a302f544 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -54,6 +54,7 @@ "security" = "Безопасность" "secAlertTitle" = "Предупреждение системы безопасности" "secAlertSsl" = "Это соединение не защищено. Пожалуйста, воздержитесь от ввода конфиденциальной информации до тех пор, пока не будет активирован TLS для защиты данных" +"secAlertConf" = "Некоторые конфигурации были определены как уязвимые для атак, что требует немедленных действий по усилению протоколов безопасности и защите от потенциальных нарушений безопасности." [menu] "dashboard" = "Статус системы" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "Показывать восстановленный трафик и дату после имени конфигурации" "subURI" = "URI обратного прокси" "subURIDesc" = "Изменить базовый URI URL-адреса подписки для использования за прокси-серверами" +"fragment" = "Фрагментация" +"fragmentDesc" = "Включить фрагментацию для пакета приветствия TLS" [pages.xray] "title" = "Настройки Xray" diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index 04be32a1..0f35af1c 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -54,6 +54,7 @@ "security" = "Bảo vệ"
"secAlertTitle" = "Cảnh báo an ninh-Tiếng Việt by Ohoang7"
"secAlertSsl" = "Kết nối này không an toàn; Vui lòng không nhập thông tin nhạy cảm cho đến khi TLS được kích hoạt để bảo vệ dữ liệu của Bạn"
+"secAlertConf" = "Một số cấu hình nhất định đã được xác định là dễ bị tấn công, thúc đẩy hành động ngay lập tức để củng cố các giao thức bảo mật và bảo vệ chống lại các vi phạm bảo mật tiềm ẩn."
[menu]
"dashboard" = "Trạng thái hệ thống"
@@ -304,6 +305,8 @@ "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"
"subURI" = "URI proxy trung gian"
"subURIDesc" = "Thay đổi URI cơ sở của URL gói đăng ký để sử dụng cho proxy trung gian"
+"fragment" = "Sự phân mảnh"
+"fragmentDesc" = "Kích hoạt phân mảnh cho gói TLS hello"
[pages.xray]
"title" = "Cài đặt Xray"
diff --git a/web/translation/translate.zh_Hans.toml b/web/translation/translate.zh_Hans.toml index 22befcd3..9d714589 100644 --- a/web/translation/translate.zh_Hans.toml +++ b/web/translation/translate.zh_Hans.toml @@ -54,6 +54,7 @@ "security" = "安全" "secAlertTitle" = "安全警报" "secAlertSsl" = "此连接不安全;在激活 TLS 进行数据保护之前,请勿输入敏感信息" +"secAlertConf" = "某些配置已被确定为容易受到攻击,促使立即采取行动以加强安全协议并防范潜在的安全漏洞。" [menu] "dashboard" = "系统状态" @@ -304,6 +305,8 @@ "subShowInfoDesc" = "在配置名称后显示剩余流量和日期" "subURI" = "反向代理 URI" "subURIDesc" = "更改订阅 URL 的基本 URI 以在代理后面使用" +"fragment" = "碎片" +"fragmentDesc" = "启用 TLS hello 数据包分段" [pages.xray] "title" = "Xray 设置" |
