diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 2f664944..500b6495 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -201,6 +201,7 @@ "route": "Route Options", "dns": "DNS Options", "inbound": "Inbound Options", + "mux": "Multiplexer", "outbound": "Outbound Options", "tlsTricks": "TLS Tricks", "misc": "Misc Options" @@ -239,7 +240,10 @@ "tlsFragmentSleep": "TLS Fragment Sleep", "enableTlsMixedSniCase": "Enable TLS Mixed SNI Case", "enableTlsPadding": "Enable TLS Padding", - "tlsPaddingSize": "TLS Padding" + "tlsPaddingSize": "TLS Padding", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "pageTitle": "Routing Assets", diff --git a/assets/translations/strings_es.i18n.json b/assets/translations/strings_es.i18n.json index 9a333384..0fb923cb 100644 --- a/assets/translations/strings_es.i18n.json +++ b/assets/translations/strings_es.i18n.json @@ -208,6 +208,7 @@ "route": "Opciones de ruta", "dns": "Opciones de DNS", "inbound": "Opciones entrantes", + "mux": "Multiplexer", "outbound": "Opciones de salida", "tlsTricks": "Trucos TLS", "misc": "Opciones varias" @@ -233,7 +234,10 @@ "tlsFragmentSleep": "Sueño de fragmento TLS", "enableTlsMixedSniCase": "Habilitar caso SNI mixto TLS", "enableTlsPadding": "Habilitar el relleno TLS", - "tlsPaddingSize": "Relleno TLS" + "tlsPaddingSize": "Relleno TLS", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "successMsg": "Activo actualizado correctamente", diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index 5b185f6a..7b9242d1 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -201,6 +201,7 @@ "route": "تنظیمات مسیریاب", "dns": "تنظیمات DNS", "inbound": "تنظیمات ورودی", + "mux": "Multiplexer", "outbound": "Outbound Options", "tlsTricks": "TLS Tricks", "misc": "تنظیمات متفرقه" @@ -239,7 +240,10 @@ "tlsFragmentSleep": "TLS Fragment Sleep", "enableTlsMixedSniCase": "Enable TLS Mixed SNI Case", "enableTlsPadding": "Enable TLS Padding", - "tlsPaddingSize": "TLS Padding" + "tlsPaddingSize": "TLS Padding", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "pageTitle": "فایل‌های مسیریابی", diff --git a/assets/translations/strings_ru.i18n.json b/assets/translations/strings_ru.i18n.json index f0af6150..12a4b278 100644 --- a/assets/translations/strings_ru.i18n.json +++ b/assets/translations/strings_ru.i18n.json @@ -201,6 +201,7 @@ "route": "Варианты маршрутизации", "dns": "Параметры DNS", "inbound": "Входящие параметры", + "mux": "Multiplexer", "outbound": "Outbound Options", "tlsTricks": "TLS Tricks", "misc": "Разные параметры" @@ -239,7 +240,10 @@ "tlsFragmentSleep": "TLS Fragment Sleep", "enableTlsMixedSniCase": "Enable TLS Mixed SNI Case", "enableTlsPadding": "Enable TLS Padding", - "tlsPaddingSize": "TLS Padding" + "tlsPaddingSize": "TLS Padding", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "pageTitle": "Активы маршрутизации", diff --git a/assets/translations/strings_tr.i18n.json b/assets/translations/strings_tr.i18n.json index 48b8b8c8..e1aa5e69 100644 --- a/assets/translations/strings_tr.i18n.json +++ b/assets/translations/strings_tr.i18n.json @@ -201,6 +201,7 @@ "route": "Rota Seçenekleri", "dns": "DNS Seçenekleri", "inbound": "Gelen Seçenekler", + "mux": "Multiplexer", "outbound": "Outbound Options", "tlsTricks": "TLS Tricks", "misc": "Çeşitli Seçenekler" @@ -239,7 +240,10 @@ "tlsFragmentSleep": "TLS Fragment Sleep", "enableTlsMixedSniCase": "Enable TLS Mixed SNI Case", "enableTlsPadding": "Enable TLS Padding", - "tlsPaddingSize": "TLS Padding" + "tlsPaddingSize": "TLS Padding", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "pageTitle": "Varlıkları Yönlendirme", diff --git a/assets/translations/strings_zh-CN.i18n.json b/assets/translations/strings_zh-CN.i18n.json index 407bf198..fc7a4f77 100644 --- a/assets/translations/strings_zh-CN.i18n.json +++ b/assets/translations/strings_zh-CN.i18n.json @@ -201,6 +201,7 @@ "route": "路由选项", "dns": "DNS 选项", "inbound": "入站选项", + "mux": "Multiplexer", "outbound": "出站选项", "tlsTricks": "TLS Tricks", "misc": "其它选项" @@ -239,7 +240,10 @@ "tlsFragmentSleep": "TLS 分段休眠", "enableTlsMixedSniCase": "启用 TLS 混合 SNI 情形", "enableTlsPadding": "启用 TLS 填充", - "tlsPaddingSize": "TLS 填充" + "tlsPaddingSize": "TLS 填充", + "enableMux": "Enable Mux", + "muxProtocol": "Mux Protocol", + "muxMaxStreams": "Max Concurrent Streams" }, "geoAssets": { "pageTitle": "路由资源文件", diff --git a/lib/features/config_option/overview/config_options_page.dart b/lib/features/config_option/overview/config_options_page.dart index b3189c7e..ad8bb52a 100644 --- a/lib/features/config_option/overview/config_options_page.dart +++ b/lib/features/config_option/overview/config_options_page.dart @@ -182,6 +182,49 @@ class ConfigOptionsPage extends HookConsumerWidget { ), ), const SettingsDivider(), + SettingsSection(experimental(t.settings.config.section.mux)), + SwitchListTile( + title: Text(t.settings.config.enableMux), + value: options.enableMux, + onChanged: (value) => changeOption( + ConfigOptionPatch(enableMux: value), + ), + ), + ListTile( + title: Text(t.settings.config.muxProtocol), + subtitle: Text(options.muxProtocol.name), + onTap: () async { + final pickedProtocol = await SettingsPickerDialog( + title: t.settings.config.muxProtocol, + selected: options.muxProtocol, + options: MuxProtocol.values, + getTitle: (e) => e.name, + resetValue: defaultOptions.muxProtocol, + ).show(context); + if (pickedProtocol == null) return; + await changeOption( + ConfigOptionPatch(muxProtocol: pickedProtocol), + ); + }, + ), + ListTile( + title: Text(t.settings.config.muxMaxStreams), + subtitle: Text(options.muxMaxStreams.toString()), + onTap: () async { + final maxStreams = await SettingsInputDialog( + title: t.settings.config.muxMaxStreams, + initialValue: options.muxMaxStreams, + resetValue: defaultOptions.muxMaxStreams, + mapTo: int.tryParse, + digitsOnly: true, + ).show(context); + if (maxStreams == null || maxStreams < 1) return; + await changeOption( + ConfigOptionPatch(muxMaxStreams: maxStreams), + ); + }, + ), + const SettingsDivider(), SettingsSection(t.settings.config.section.inbound), ListTile( title: Text(t.settings.config.serviceMode),