Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShishkevich D. <135337715+shishkevichd@users.noreply.github.com>2025-06-18 19:24:18 +0300
committerGitHub <noreply@github.com>2025-06-18 19:24:18 +0300
commitcb22b4ad47816742e7eaa9b9f46f11530b0aae8e (patch)
tree486f3d1c1af5b4bd22c5bd48c164f1db168f88cd
parent6a2e0071cfb27d290f3e3aca9eda184f2ac7d15e (diff)
chore: add new dns features from v25.6.8
* chore: add new dns params * chore: add `DNS Presets` modal * chore: edit file names
-rw-r--r--web/html/modals/dns_presets_modal.html110
-rw-r--r--web/html/modals/fakedns_modal.html57
-rw-r--r--web/html/modals/xray_dns_modal.html (renamed from web/html/modals/dns_modal.html)111
-rw-r--r--web/html/modals/xray_fakedns_modal.html56
-rw-r--r--web/html/settings/xray/basics.html14
-rw-r--r--web/html/settings/xray/dns.html19
-rw-r--r--web/html/xray.html51
-rw-r--r--web/translation/translate.ar_EG.toml10
-rw-r--r--web/translation/translate.en_US.toml10
-rw-r--r--web/translation/translate.es_ES.toml10
-rw-r--r--web/translation/translate.fa_IR.toml10
-rw-r--r--web/translation/translate.id_ID.toml9
-rw-r--r--web/translation/translate.ja_JP.toml10
-rw-r--r--web/translation/translate.pt_BR.toml10
-rw-r--r--web/translation/translate.ru_RU.toml20
-rw-r--r--web/translation/translate.tr_TR.toml10
-rw-r--r--web/translation/translate.uk_UA.toml10
-rw-r--r--web/translation/translate.vi_VN.toml10
-rw-r--r--web/translation/translate.zh_CN.toml10
-rw-r--r--web/translation/translate.zh_TW.toml10
20 files changed, 354 insertions, 203 deletions
diff --git a/web/html/modals/dns_presets_modal.html b/web/html/modals/dns_presets_modal.html
new file mode 100644
index 00000000..010b973a
--- /dev/null
+++ b/web/html/modals/dns_presets_modal.html
@@ -0,0 +1,110 @@
+{{define "modals/dnsPresetsModal"}}
+<a-modal id="dnsPresets-modal" v-model="dnsPresetsModal.visible" :title="dnsPresetsModal.title" :closable="true"
+ :mask-closable="false" :footer="null" :class="themeSwitcher.currentTheme">
+ <a-list class="ant-dns-presets-list" bordered :style="{ width: '100%' }">
+ <a-list-item v-for="dns in dnsPresetsDatabase" :style="{ padding: '12px 16px' }">
+ <a-row justify="space-between" align="middle">
+ <a-col :span="12">
+ <a-space direction="vertical" size="small">
+ <span class="ant-dns-presets-list-name">[[ dns.name ]]</span>
+ <a-tag :color="dns.family ? 'purple' : 'green'">[[ dns.family ? '{{ i18n "pages.xray.dns.dnsPresetFamily" }}' : 'DNS' ]]</a-tag>
+ </a-space>
+ </a-col>
+ <a-col :span="12" :style="{ textAlign: 'right' }">
+ <a-button type="primary" @click="dnsPresetsModal.install(dns.data)">{{ i18n "install" }}</a-button>
+ </a-col>
+ </a-row>
+ </a-list-item>
+ </a-list>
+</a-modal>
+
+<style>
+ .dark .ant-dns-presets-list {
+ border-color: var(--dark-color-stroke)
+ }
+
+ .dark .ant-dns-presets-list-name {
+ color: var(--dark-color-text-primary);
+ }
+</style>
+
+<script>
+ const dnsPresetsDatabase = [
+ {
+ name: 'Google DNS',
+ family: false,
+ data: [
+ "8.8.8.8",
+ "8.8.4.4",
+ "2001:4860:4860::8888",
+ "2001:4860:4860::8844"
+ ]
+ },
+ {
+ name: 'Cloudflare DNS',
+ family: false,
+ data: [
+ "1.1.1.1",
+ "1.0.0.1",
+ "2606:4700:4700::1111",
+ "2606:4700:4700::1001"
+ ]
+ },
+ {
+ name: 'Adguard DNS',
+ family: false,
+ data: [
+ "94.140.14.14",
+ "94.140.15.15",
+ "2a10:50c0::ad1:ff",
+ "2a10:50c0::ad2:ff"
+ ]
+ },
+ {
+ name: 'Adguard Family DNS',
+ family: true,
+ data: [
+ "94.140.14.14",
+ "94.140.15.15",
+ "2a10:50c0::ad1:ff",
+ "2a10:50c0::ad2:ff"
+ ]
+ },
+ {
+ name: 'Cloudflare Family DNS',
+ family: true,
+ data: [
+ "1.1.1.3",
+ "1.0.0.3",
+ "2606:4700:4700::1113",
+ "2606:4700:4700::1003"
+ ]
+ }
+ ]
+
+ const dnsPresetsModal = {
+ title: '',
+ visible: false,
+ selected: null,
+ install(selectedPreset) {
+ return ObjectUtil.execute(dnsPresetsModal.selected, selectedPreset);
+ },
+ show({ title = '', selected = (selectedPreset) => { }, isEdit = false }) {
+ this.title = title;
+ this.selected = selected;
+ this.visible = true;
+ },
+ close() {
+ dnsPresetsModal.visible = false;
+ },
+ };
+
+ new Vue({
+ delimiters: ['[[', ']]'],
+ el: '#dnsPresets-modal',
+ data: {
+ dnsPresetsModal: dnsPresetsModal,
+ }
+ });
+</script>
+{{end}} \ No newline at end of file
diff --git a/web/html/modals/fakedns_modal.html b/web/html/modals/fakedns_modal.html
deleted file mode 100644
index 8e554ac0..00000000
--- a/web/html/modals/fakedns_modal.html
+++ /dev/null
@@ -1,57 +0,0 @@
-{{define "modals/fakednsModal"}}
-<a-modal id="fakedns-modal" v-model="fakednsModal.visible" :title="fakednsModal.title" @ok="fakednsModal.ok"
- :closable="true" :mask-closable="false"
- :ok-text="fakednsModal.okText" cancel-text='{{ i18n "close" }}' :class="themeSwitcher.currentTheme">
- <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
- <a-form-item label='{{ i18n "pages.xray.fakedns.ipPool" }}'>
- <a-input v-model.trim="fakednsModal.fakeDns.ipPool"></a-input>
- </a-form-item>
- <a-form-item label='{{ i18n "pages.xray.fakedns.poolSize" }}'>
- <a-input-number v-model.number="fakednsModal.fakeDns.poolSize" :min="1"></a-input-number>
- </a-form-item>
- </a-form>
-</a-modal>
-<script>
- const fakednsModal = {
- title: '',
- visible: false,
- okText: '{{ i18n "confirm" }}',
- isEdit: false,
- confirm: null,
- fakeDns: {
- ipPool: "198.18.0.0/16",
- poolSize: 65535,
- },
- ok() {
- ObjectUtil.execute(fakednsModal.confirm, fakednsModal.fakeDns);
- },
- show({ title='', okText='{{ i18n "confirm" }}', fakeDns, confirm=(fakeDns)=>{}, isEdit=false }) {
- this.title = title;
- this.okText = okText;
- this.confirm = confirm;
- this.visible = true;
- if(isEdit) {
- this.fakeDns = fakeDns;
- } else {
- this.fakeDns = {
- ipPool: "198.18.0.0/16",
- poolSize: 65535,
- }
- }
- this.isEdit = isEdit;
- },
- close() {
- fakednsModal.visible = false;
- },
- };
-
- new Vue({
- delimiters: ['[[', ']]'],
- el: '#fakedns-modal',
- data: {
- fakednsModal: fakednsModal,
- }
- });
-
-</script>
-{{end}}
diff --git a/web/html/modals/dns_modal.html b/web/html/modals/xray_dns_modal.html
index e6266c06..484bd2f8 100644
--- a/web/html/modals/dns_modal.html
+++ b/web/html/modals/xray_dns_modal.html
@@ -6,6 +6,16 @@
<a-form-item label='{{ i18n "pages.xray.outbound.address" }}'>
<a-input v-model.trim="dnsModal.dnsServer.address"></a-input>
</a-form-item>
+ <a-form-item label='{{ i18n "pages.inbounds.port" }}'>
+ <a-input-number v-model.number="dnsModal.dnsServer.port" :min="1" :max="65531"></a-input-number>
+ </a-form-item>
+ <a-form-item label='{{ i18n "pages.xray.dns.strategy" }}'>
+ <a-select v-model="dnsModal.dnsServer.queryStrategy" :style="{ width: '100%' }"
+ :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option :value="l" :label="l" v-for="l in ['UseSystem', 'UseIP', 'UseIPv4', 'UseIPv6']"> [[ l ]] </a-select-option>
+ </a-select>
+ </a-form-item>
+ <a-divider :style="{ margin: '5px 0' }"></a-divider>
<a-form-item label='{{ i18n "pages.xray.dns.domains" }}'>
<a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.domains.push('')"></a-button>
<template v-for="(domain, index) in dnsModal.dnsServer.domains">
@@ -15,15 +25,6 @@
</a-input>
</template>
</a-form-item>
- <a-form-item label='{{ i18n "pages.xray.dns.strategy" }}' v-if="isAdvanced">
- <a-select v-model="dnsModal.dnsServer.queryStrategy" :style="{ width: '100%' }"
- :dropdown-class-name="themeSwitcher.currentTheme">
- <a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']"> [[ l ]] </a-select-option>
- </a-select>
- </a-form-item>
- <a-form-item label='Skip Fallback' v-if="isAdvanced">
- <a-switch v-model="dnsModal.dnsServer.skipFallback"></a-switch>
- </a-form-item>
<a-form-item label='{{ i18n "pages.xray.dns.expectIPs"}}'>
<a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.expectIPs.push('')"></a-button>
<template v-for="(domain, index) in dnsModal.dnsServer.expectIPs">
@@ -33,31 +34,50 @@
</a-input>
</template>
</a-form-item>
+ <a-form-item label='{{ i18n "pages.xray.dns.unexpectIPs"}}'>
+ <a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.unexpectedIPs.push('')"></a-button>
+ <template v-for="(domain, index) in dnsModal.dnsServer.unexpectedIPs">
+ <a-input v-model.trim="dnsModal.dnsServer.unexpectedIPs[index]">
+ <a-button icon="minus" size="small" slot="addonAfter"
+ @click="dnsModal.dnsServer.unexpectedIPs.splice(index,1)"></a-button>
+ </a-input>
+ </template>
+ </a-form-item>
+ <a-divider :style="{ margin: '5px 0' }"></a-divider>
+ <a-form-item label='Skip Fallback'>
+ <a-switch v-model="dnsModal.dnsServer.skipFallback"></a-switch>
+ </a-form-item>
+ <a-form-item label='Disable Cache'>
+ <a-switch v-model="dnsModal.dnsServer.disableCache"></a-switch>
+ </a-form-item>
+ <a-form-item label='Final Query'>
+ <a-switch v-model="dnsModal.dnsServer.finalQuery"></a-switch>
+ </a-form-item>
</a-form>
</a-modal>
<script>
+ const defaultDnsObject = {
+ address: "localhost",
+ port: 53,
+ domains: [],
+ expectIPs: [],
+ unexpectedIPs: [],
+ queryStrategy: 'UseIP',
+ skipFallback: true,
+ disableCache: false,
+ finalQuery: false
+ }
+
const dnsModal = {
title: '',
visible: false,
okText: '{{ i18n "confirm" }}',
isEdit: false,
confirm: null,
- dnsServer: {
- address: "localhost",
- domains: [],
- expectIPs: [],
- queryStrategy: 'UseIP',
- skipFallback: true,
+ dnsServer: { ...defaultDnsObject },
+ ok() {
+ ObjectUtil.execute(dnsModal.confirm, { ...dnsModal.dnsServer });
},
- ok() {
- domains = dnsModal.dnsServer.domains.filter(d => d.length > 0);
- expectIPs = dnsModal.dnsServer.expectIPs.filter(ip => ip.length > 0);
- dnsModal.dnsServer.domains = domains;
- dnsModal.dnsServer.expectIPs = expectIPs;
- newDnsServer = (domains.length > 0 || expectIPs.length > 0) ? dnsModal.dnsServer : dnsModal.dnsServer.address;
- ObjectUtil.execute(dnsModal.confirm, newDnsServer);
- },
-
show({
title = '',
okText = '{{ i18n "confirm" }}',
@@ -69,28 +89,28 @@
this.okText = okText;
this.confirm = confirm;
this.visible = true;
+ this.isEdit = isEdit;
+
if (isEdit) {
- if (typeof dnsServer == 'object') {
- this.dnsServer = dnsServer;
- } else {
- this.dnsServer = {
- address: dnsServer ?? "",
- domains: [],
- expectIPs: [],
- queryStrategy: 'UseIP',
- skipFallback: true,
- }
+ switch (typeof dnsServer) {
+ case 'string':
+ const dnsObj = { ...defaultDnsObject };
+
+ dnsObj.address = dnsServer;
+
+ this.dnsServer = dnsObj;
+ break;
+ case 'object':
+ this.dnsServer = dnsServer;
+ break;
}
} else {
- this.dnsServer = {
- address: "localhost",
- domains: [],
- expectIPs: [],
- queryStrategy: 'UseIP',
- skipFallback: true,
- }
+ this.dnsServer = { ...defaultDnsObject };
+
+ this.dnsServer.domains = [];
+ this.dnsServer.expectIPs = [];
+ this.dnsServer.unexpectedIPs = [];
}
- this.isEdit = isEdit;
},
close() {
dnsModal.visible = false;
@@ -101,13 +121,6 @@
el: '#dns-modal',
data: {
dnsModal: dnsModal,
- },
- computed: {
- isAdvanced: {
- get: function () {
- return dnsModal.dnsServer.domains.length > 0;
- }
- }
}
});
</script>
diff --git a/web/html/modals/xray_fakedns_modal.html b/web/html/modals/xray_fakedns_modal.html
new file mode 100644
index 00000000..f1f4429c
--- /dev/null
+++ b/web/html/modals/xray_fakedns_modal.html
@@ -0,0 +1,56 @@
+{{define "modals/fakednsModal"}}
+<a-modal id="fakedns-modal" v-model="fakednsModal.visible" :title="fakednsModal.title" @ok="fakednsModal.ok"
+ :closable="true" :mask-closable="false" :ok-text="fakednsModal.okText" cancel-text='{{ i18n "close" }}'
+ :class="themeSwitcher.currentTheme">
+ <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
+ <a-form-item label='{{ i18n "pages.xray.fakedns.ipPool" }}'>
+ <a-input v-model.trim="fakednsModal.fakeDns.ipPool"></a-input>
+ </a-form-item>
+ <a-form-item label='{{ i18n "pages.xray.fakedns.poolSize" }}'>
+ <a-input-number v-model.number="fakednsModal.fakeDns.poolSize" :min="1"></a-input-number>
+ </a-form-item>
+ </a-form>
+</a-modal>
+<script>
+ const fakednsDefaultData = {
+ ipPool: "198.18.0.0/16",
+ poolSize: 65535,
+ }
+
+ const fakednsModal = {
+ title: '',
+ visible: false,
+ okText: '{{ i18n "confirm" }}',
+ isEdit: false,
+ confirm: null,
+ fakeDns: { ...fakednsDefaultData },
+ ok() {
+ ObjectUtil.execute(fakednsModal.confirm, fakednsModal.fakeDns);
+ },
+ show({ title = '', okText = '{{ i18n "confirm" }}', fakeDns, confirm = (fakeDns) => { }, isEdit = false }) {
+ this.title = title;
+ this.okText = okText;
+ this.confirm = confirm;
+ this.visible = true;
+ if (isEdit) {
+ this.fakeDns = fakeDns;
+ } else {
+ this.fakeDns = { ...fakednsDefaultData }
+ }
+ this.isEdit = isEdit;
+ },
+ close() {
+ fakednsModal.visible = false;
+ },
+ };
+
+ new Vue({
+ delimiters: ['[[', ']]'],
+ el: '#fakedns-modal',
+ data: {
+ fakednsModal: fakednsModal,
+ }
+ });
+
+</script>
+{{end}} \ No newline at end of file
diff --git a/web/html/settings/xray/basics.html b/web/html/settings/xray/basics.html
index 374cb7dd..71aa0d7c 100644
--- a/web/html/settings/xray/basics.html
+++ b/web/html/settings/xray/basics.html
@@ -135,7 +135,7 @@
</template>
</a-setting-list-item>
</a-collapse-panel>
- <a-collapse-panel key="4" header='{{ i18n "pages.xray.blockConfigs"}}'>
+ <a-collapse-panel key="4" header='{{ i18n "pages.xray.basicRouting"}}'>
<a-row :xs="24" :sm="24" :lg="12">
<a-alert type="warning" :style="{ textAlign: 'center' }">
<template slot="message">
@@ -144,22 +144,12 @@
</template>
</a-alert>
</a-row>
- <a-setting-list-item paddings="small">
+ <a-setting-list-item paddings="small" :style="{ marginBottom: '20px' }">
<template #title>{{ i18n "pages.xray.Torrent"}}</template>
- <template #description>{{ i18n "pages.xray.TorrentDesc"}}</template>
<template #control>
<a-switch v-model="torrentSettings"></a-switch>
</template>
</a-setting-list-item>
- <a-setting-list-item paddings="small">
- <template #title>{{ i18n "pages.xray.Family"}}</template>
- <template #description>{{ i18n "pages.xray.FamilyDesc"}}</template>
- <template #control>
- <a-switch v-model="familyProtectSettings"></a-switch>
- </template>
- </a-setting-list-item>
- </a-collapse-panel>
- <a-collapse-panel key="5" header='{{ i18n "pages.xray.basicRouting"}}'>
<a-row :xs="24" :sm="24" :lg="12">
<a-alert type="warning" :style="{ textAlign: 'center' }">
<template slot="message">
diff --git a/web/html/settings/xray/dns.html b/web/html/settings/xray/dns.html
index 11558536..ba768cb8 100644
--- a/web/html/settings/xray/dns.html
+++ b/web/html/settings/xray/dns.html
@@ -29,7 +29,7 @@
<template #control>
<a-select v-model="dnsStrategy" :style="{ width: '100%' }"
:dropdown-class-name="themeSwitcher.currentTheme">
- <a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']">
+ <a-select-option :value="l" :label="l" v-for="l in ['UseSystem', 'UseIP', 'UseIPv4', 'UseIPv6']">
<span>[[ l ]]</span>
</a-select-option>
</a-select>
@@ -56,6 +56,14 @@
<a-switch v-model="dnsDisableFallbackIfMatch"></a-switch>
</template>
</a-setting-list-item>
+
+ <a-setting-list-item paddings="small">
+ <template #title>{{ i18n "pages.xray.dns.useSystemHosts" }}</template>
+ <template #description>{{ i18n "pages.xray.dns.useSystemHostsDesc" }}</template>
+ <template #control>
+ <a-switch v-model="dnsUseSystemHosts"></a-switch>
+ </template>
+ </a-setting-list-item>
</template>
</a-collapse-panel>
<template v-if="enableDNS">
@@ -102,9 +110,12 @@
</template>
<template v-else>
<a-empty description='{{ i18n "emptyDnsDesc" }}' :style="{ margin: '10px' }">
- <a-button type="primary" icon="plus" @click="addDNSServer()" :style="{ marginTop: '10px' }">
- <span>{{ i18n "pages.xray.dns.add" }}</span>
- </a-button>
+ <a-button-group>
+ <a-button type="primary" icon="plus" @click="addDNSServer()">
+ <span>{{ i18n "pages.xray.dns.add" }}</span>
+ </a-button>
+ <a-button type="primary" icon="menu" @click="openDNSPresets()"></a-button>
+ </a-button-group>
</a-empty>
</template>
</a-collapse-panel>
diff --git a/web/html/xray.html b/web/html/xray.html
index e051ce15..eb99b794 100644
--- a/web/html/xray.html
+++ b/web/html/xray.html
@@ -128,6 +128,7 @@
{{template "modals/reverseModal"}}
{{template "modals/balancerModal"}}
{{template "modals/dnsModal"}}
+{{template "modals/dnsPresetsModal"}}
{{template "modals/fakednsModal"}}
{{template "modals/warpModal"}}
<script>
@@ -308,16 +309,7 @@
{ label: 'Netflix', value: 'geosite:netflix' },
{ label: 'Reddit', value: 'geosite:reddit' },
{ label: 'Speedtest', value: 'geosite:speedtest' },
- ],
- familyProtectDNS: {
- "servers": [
- "1.1.1.3", // https://developers.cloudflare.com/1.1.1.1/setup/
- "1.0.0.3",
- "2606:4700:4700::1113",
- "2606:4700:4700::1003"
- ],
- "queryStrategy": "UseIP"
- },
+ ]
},
defaultObservatory: {
subjectSelector: [],
@@ -826,6 +818,16 @@
this.obsSettings = '';
this.changeObsCode()
},
+ openDNSPresets() {
+ dnsPresetsModal.show({
+ title: '{{ i18n "pages.xray.dns.dnsPresetTitle" }}',
+ selected: (selectedPreset) => {
+ this.dnsServers = selectedPreset;
+
+ dnsPresetsModal.close();
+ }
+ });
+ },
addDNSServer(){
dnsModal.show({
title: '{{ i18n "pages.xray.dns.add" }}',
@@ -1270,21 +1272,6 @@
}
},
},
- familyProtectSettings: {
- get: function () {
- if (!this.templateSettings || !this.templateSettings.dns || !this.templateSettings.dns.servers) return false;
- return ArrayUtils.doAllItemsExist(this.settingsData.familyProtectDNS.servers, this.templateSettings.dns.servers);
- },
- set: function (newValue) {
- newTemplateSettings = this.templateSettings;
- if (newValue) {
- newTemplateSettings.dns = this.settingsData.familyProtectDNS;
- } else {
- newTemplateSettings.dns.servers = newTemplateSettings.dns?.servers?.filter(data => !this.settingsData.familyProtectDNS.servers.includes(data))
- }
- this.templateSettings = newTemplateSettings;
- },
- },
WarpExist: {
get: function() {
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag == "warp")>=0 : false;
@@ -1376,6 +1363,20 @@
this.templateSettings = newTemplateSettings;
}
},
+ dnsUseSystemHosts: {
+ get: function () {
+ return this.enableDNS ? this.templateSettings.dns.useSystemHosts : false;
+ },
+ set: function (newValue) {
+ newTemplateSettings = this.templateSettings;
+ if (newValue) {
+ newTemplateSettings.dns.useSystemHosts = newValue;
+ } else {
+ delete newTemplateSettings.dns.useSystemHosts
+ }
+ this.templateSettings = newTemplateSettings;
+ }
+ },
dnsStrategy: {
get: function () {
return this.enableDNS ? this.templateSettings.dns.queryStrategy : null;
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index efb84b69..50e1680f 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -400,7 +400,6 @@
"generalConfigsDesc" = "الخيارات دي هتحدد التعديلات العامة."
"logConfigs" = "السجلات"
"logConfigsDesc" = "السجلات ممكن تأثر على كفاءة السيرفر. ننصح بتفعيلها بحكمة لما تكون محتاجها."
-"blockConfigs" = "درع الحماية"
"blockConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على بروتوكولات ومواقع محددة."
"basicRouting" = "توجيه أساسي"
"blockConnectionsConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على الدولة المطلوبة."
@@ -420,9 +419,6 @@
"RoutingStrategy" = "استراتيجية التوجيه العامة"
"RoutingStrategyDesc" = "حدد استراتيجية التوجيه الإجمالية لحل كل الطلبات."
"Torrent" = "حظر بروتوكول التورنت"
-"TorrentDesc" = "بيحجب بروتوكول التورنت."
-"Family" = "حماية العيلة"
-"FamilyDesc" = "بيحجب المحتويات الكبار وعناوين المواقع الضارة."
"Inbounds" = "الإدخالات"
"InboundsDesc" = "قبول العملاء المعينين."
"Outbounds" = "المخرجات"
@@ -522,6 +518,12 @@
"edit" = "عدل السيرفر"
"domains" = "الدومينات"
"expectIPs" = "العناوين المتوقعة"
+"unexpectIPs" = "عناوين IP غير متوقعة"
+"useSystemHosts" = "استخدام ملف Hosts الخاص بالنظام"
+"useSystemHostsDesc" = "استخدام ملف hosts من نظام مثبت"
+"usePreset" = "استخدام النموذج"
+"dnsPresetTitle" = "قوالب DNS"
+"dnsPresetFamily" = "العائلي"
[pages.xray.fakedns]
"add" = "أضف Fake DNS"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index bb407b5f..33339fa7 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -399,7 +399,6 @@
"generalConfigsDesc" = "These options will determine general adjustments."
"logConfigs" = "Log"
"logConfigsDesc" = "Logs may affect your server's efficiency. It is recommended to enable it wisely only in case of your needs"
-"blockConfigs" = "Protection Shield"
"blockConfigsDesc" = "These options will block traffic based on specific requested protocols and websites."
"basicRouting" = "Basic Routing"
"blockConnectionsConfigsDesc" = "These options will block traffic based on the specific requested country."
@@ -419,9 +418,6 @@
"RoutingStrategy" = "Overall Routing Strategy"
"RoutingStrategyDesc" = "Set the overall traffic routing strategy for resolving all requests."
"Torrent" = "Block BitTorrent Protocol"
-"TorrentDesc" = "Blocks BitTorrent protocol."
-"Family" = "Family Protection"
-"FamilyDesc" = "Blocks adult content, and malware websites."
"Inbounds" = "Inbounds"
"InboundsDesc" = "Accepting the specific clients."
"Outbounds" = "Outbounds"
@@ -521,6 +517,12 @@
"edit" = "Edit Server"
"domains" = "Domains"
"expectIPs" = "Expect IPs"
+"unexpectIPs" = "Unexpect IPs"
+"useSystemHosts" = "Use System Hosts"
+"useSystemHostsDesc" = "Use the hosts file from an installed system"
+"usePreset" = "Use Preset"
+"dnsPresetTitle" = "DNS Presets"
+"dnsPresetFamily" = "Family"
[pages.xray.fakedns]
"add" = "Add Fake DNS"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 7d4d8cee..0b8d009c 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Estas opciones proporcionarán ajustes generales."
"logConfigs" = "Registro"
"logConfigsDesc" = "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades."
-"blockConfigs" = "Configuraciones de Bloqueo"
"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
"basicRouting" = "Enrutamiento Básico"
"blockConnectionsConfigsDesc" = "Estas opciones bloquearán el tráfico según el país solicitado específico."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Configurar Estrategia de Enrutamiento de Dominios"
"RoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
"Torrent" = "Prohibir Uso de BitTorrent"
-"TorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
-"Family" = "Bloquee malware y contenido para adultos"
-"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
"Inbounds" = "Entrante"
"InboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
"Outbounds" = "Salidas"
@@ -524,6 +520,12 @@
"edit" = "Editar Servidor"
"domains" = "Dominios"
"expectIPs" = "IPs esperadas"
+"unexpectIPs" = "IPs inesperadas"
+"useSystemHosts" = "Usar Hosts del sistema"
+"useSystemHostsDesc" = "Usar el archivo hosts de un sistema instalado"
+"usePreset" = "Usar plantilla"
+"dnsPresetTitle" = "Plantillas DNS"
+"dnsPresetFamily" = "Familiar"
[pages.xray.fakedns]
"add" = "Agregar DNS Falso"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index 475abcf8..9d53f47d 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "این گزینه‌ها استراتژی کلی ترافیک را تعیین می‌کنند"
"logConfigs" = "گزارش"
"logConfigsDesc" = "گزارش‌ها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید"
-"blockConfigs" = "سپر محافظ"
"blockConfigsDesc" = "این گزینه‌ها ترافیک را بر اساس پروتکل‌های درخواستی خاص، و وب سایت‌ها مسدود می‌کند"
"basicRouting" = "مسیریابی پایه"
"blockConnectionsConfigsDesc" = "این گزینه‌ها ترافیک را بر اساس کشور درخواست‌شده خاص مسدود می‌کنند."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "استراتژی کلی مسیریابی"
"RoutingStrategyDesc" = "استراتژی کلی مسیریابی برای حل تمام درخواست‌ها را تعیین می‌کند"
"Torrent" = "مسدودسازی پروتکل بیت‌تورنت"
-"TorrentDesc" = "پروتکل بیت تورنت را مسدود می‌کند"
-"Family" = "محافظت خانواده"
-"FamilyDesc" = "محتوای مخصوص بزرگسالان، و وب‌سایت‌های ناامن را مسدود می‌کند"
"Inbounds" = "ورودی‌ها"
"InboundsDesc" = "پذیرش کلاینت خاص"
"Outbounds" = "خروجی‌ها"
@@ -524,6 +520,12 @@
"edit" = "ویرایش سرور"
"domains" = "دامنه‌ها"
"expectIPs" = "آی‌پی‌های مورد انتظار"
+"unexpectIPs" = "آی‌پی‌های غیرمنتظره"
+"useSystemHosts" = "استفاده از Hosts سیستم"
+"useSystemHostsDesc" = "استفاده از فایل hosts یک سیستم نصب‌شده"
+"usePreset" = "استفاده از پیش‌تنظیم"
+"dnsPresetTitle" = "پیش‌تنظیم‌های DNS"
+"dnsPresetFamily" = "خانوادگی"
[pages.xray.fakedns]
"add" = "افزودن دی‌ان‌اس جعلی"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index 29422d6e..f6a45b92 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Opsi ini akan menentukan penyesuaian strategi umum."
"logConfigs" = "Catatan"
"logConfigsDesc" = "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan"
-"blockConfigs" = "Pelindung"
"blockConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta."
"basicRouting" = "Perutean Dasar"
"blockConnectionsConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta."
@@ -423,8 +422,6 @@
"RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan."
"Torrent" = "Blokir Protokol BitTorrent"
"TorrentDesc" = "Memblokir protokol BitTorrent."
-"Family" = "Proteksi Keluarga"
-"FamilyDesc" = "Memblokir konten dewasa dan situs web berbahaya."
"Inbounds" = "Masuk"
"InboundsDesc" = "Menerima klien tertentu."
"Outbounds" = "Keluar"
@@ -524,6 +521,12 @@
"edit" = "Sunting Server"
"domains" = "Domains"
"expectIPs" = "IP yang Diharapkan"
+"unexpectIPs" = "IP tak terduga"
+"useSystemHosts" = "Gunakan Hosts Sistem"
+"useSystemHostsDesc" = "Gunakan file hosts dari sistem yang terinstal"
+"usePreset" = "Gunakan templat"
+"dnsPresetTitle" = "Templat DNS"
+"dnsPresetFamily" = "Keluarga"
[pages.xray.fakedns]
"add" = "Tambahkan DNS Palsu"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index d02b99c4..fa5ed69a 100644
--- a/