From 2c32da4c9549d916a2e9b86f0797d7ad7fc10cba Mon Sep 17 00:00:00 2001 From: DHR60 Date: Sat, 29 Mar 2025 16:08:53 +0800 Subject: [PATCH] Refactor multi-server configuration UI logic --- v2rayN/ServiceLib/Handler/ConfigHandler.cs | 32 +- .../ServiceLib/Handler/CoreConfigHandler.cs | 13 +- v2rayN/ServiceLib/Resx/ResUI.Designer.cs | 48 +- v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx | 456 +++++++++--------- v2rayN/ServiceLib/Resx/ResUI.hu.resx | 24 +- v2rayN/ServiceLib/Resx/ResUI.resx | 26 +- v2rayN/ServiceLib/Resx/ResUI.ru.resx | 448 ++++++++--------- v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx | 60 ++- v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx | 287 +++++------ .../CoreConfig/CoreConfigV2rayService.cs | 54 +-- .../ViewModels/ProfilesViewModel.cs | 29 +- .../v2rayN.Desktop/Views/ProfilesView.axaml | 9 +- .../Views/ProfilesView.axaml.cs | 7 +- v2rayN/v2rayN/Views/ProfilesView.xaml | 27 +- v2rayN/v2rayN/Views/ProfilesView.xaml.cs | 7 +- 15 files changed, 818 insertions(+), 709 deletions(-) diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 58942f4b..61400564 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -1005,32 +1005,11 @@ namespace ServiceLib.Handler return 0; } - public static async Task AddCustomServer4Multiple(Config config, List selecteds, EMultipleLoad multipleLoad) + public static async Task AddCustomServer4Multiple(Config config, List selecteds,ECoreType coreType, EMultipleLoad multipleLoad) { var indexId = Utils.GetMd5(Global.CoreMultipleLoadConfigFileName); var configPath = Utils.GetConfigPath(Global.CoreMultipleLoadConfigFileName); - var coreType = AppHandler.Instance.Config.CoreTypeItem?.FirstOrDefault(it => it.ConfigType == EConfigType.Custom)?.CoreType ?? ECoreType.Xray; - if (multipleLoad == EMultipleLoad.LeastPing && coreType == ECoreType.Xray) - { - var support = selecteds.All(it => it.ConfigType is - EConfigType.VMess or - EConfigType.VLESS or - EConfigType.Trojan or - EConfigType.Shadowsocks or - EConfigType.SOCKS or - EConfigType.HTTP or - EConfigType.WireGuard); - if (!support) - { - coreType = ECoreType.sing_box; - } - } - else if (multipleLoad == EMultipleLoad.RoundRobin) - { - coreType = ECoreType.Xray; - } - var result = await CoreConfigHandler.GenerateClientMultipleLoadConfig(config, configPath, selecteds, coreType, multipleLoad); if (result.Success != true) { @@ -1044,7 +1023,14 @@ namespace ServiceLib.Handler var profileItem = await AppHandler.Instance.GetProfileItem(indexId) ?? new(); profileItem.IndexId = indexId; - profileItem.Remarks = coreType == ECoreType.sing_box ? ResUI.menuSetDefaultMultipleServer : ResUI.menuSetDefaultLoadBalanceServer; + profileItem.Remarks = multipleLoad switch + { + EMultipleLoad.Random => ResUI.menuSetDefaultMultipleServerXrayRandom, + EMultipleLoad.RoundRobin => ResUI.menuSetDefaultMultipleServerXrayRoundRobin, + EMultipleLoad.LeastPing => ResUI.menuSetDefaultMultipleServerXrayLeastPing, + EMultipleLoad.LeastLoad => ResUI.menuSetDefaultMultipleServerXrayLeastLoad, + _ => ResUI.menuSetDefaultMultipleServerXrayRoundRobin, + }; profileItem.Address = Global.CoreMultipleLoadConfigFileName; profileItem.ConfigType = EConfigType.Custom; profileItem.CoreType = coreType; diff --git a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs index d9fddb58..00f8623b 100644 --- a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs @@ -140,20 +140,13 @@ namespace ServiceLib.Handler public static async Task GenerateClientMultipleLoadConfig(Config config, string fileName, List selecteds, ECoreType coreType, EMultipleLoad multipleLoad) { var result = new RetResult(); - if (multipleLoad == EMultipleLoad.RoundRobin) + if (coreType == ECoreType.sing_box) { - result = await new CoreConfigV2rayService(config).GenerateClientMultipleRoundRobinConfig(selecteds); + result = await new CoreConfigSingboxService(config).GenerateClientMultipleLoadConfig(selecteds); } else { - if (coreType == ECoreType.sing_box) - { - result = await new CoreConfigSingboxService(config).GenerateClientMultipleLoadConfig(selecteds); - } - else if (coreType == ECoreType.Xray) - { - result = await new CoreConfigV2rayService(config).GenerateClientMultipleLeastPingConfig(selecteds); - } + result = await new CoreConfigV2rayService(config).GenerateClientMultipleLoadConfig(selecteds, multipleLoad); } if (result.Success != true) diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index fc5fcc92..63932bed 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -1474,20 +1474,56 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 Multi-server load balancing 的本地化字符串。 + /// 查找类似 Multi-Server lowest latency sing-box 的本地化字符串。 /// - public static string menuSetDefaultLoadBalanceServer { + public static string menuSetDefaultMultipleServerSingBoxLeastPing { get { - return ResourceManager.GetString("menuSetDefaultLoadBalanceServer", resourceCulture); + return ResourceManager.GetString("menuSetDefaultMultipleServerSingBoxLeastPing", resourceCulture); } } /// - /// 查找类似 Multi-Server lowest latency 的本地化字符串。 + /// 查找类似 Multi-Server Xray 的本地化字符串。 /// - public static string menuSetDefaultMultipleServer { + public static string menuSetDefaultMultipleServerXray { get { - return ResourceManager.GetString("menuSetDefaultMultipleServer", resourceCulture); + return ResourceManager.GetString("menuSetDefaultMultipleServerXray", resourceCulture); + } + } + + /// + /// 查找类似 Multi-Server LeastLoad 的本地化字符串。 + /// + public static string menuSetDefaultMultipleServerXrayLeastLoad { + get { + return ResourceManager.GetString("menuSetDefaultMultipleServerXrayLeastLoad", resourceCulture); + } + } + + /// + /// 查找类似 Multi-Server LeastPing 的本地化字符串。 + /// + public static string menuSetDefaultMultipleServerXrayLeastPing { + get { + return ResourceManager.GetString("menuSetDefaultMultipleServerXrayLeastPing", resourceCulture); + } + } + + /// + /// 查找类似 Multi-Server Random 的本地化字符串。 + /// + public static string menuSetDefaultMultipleServerXrayRandom { + get { + return ResourceManager.GetString("menuSetDefaultMultipleServerXrayRandom", resourceCulture); + } + } + + /// + /// 查找类似 Multi-Server RoundRobin 的本地化字符串。 + /// + public static string menuSetDefaultMultipleServerXrayRoundRobin { + get { + return ResourceManager.GetString("menuSetDefaultMultipleServerXrayRoundRobin", resourceCulture); } } diff --git a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx index bb62cf05..dda5bc32 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx @@ -936,21 +936,219 @@ تنظیمات TunMode + + انتقال به گروه + + + فعال کردن مرتب‌سازی سرورها با کشیدن و رها کردن (نیاز به راه‌اندازی مجدد) + + + بازخوانی خودکار + + + رد شدن از آزمون + + + ویرایش سرور (Ctrl+D) + + + دوبار کلیک کردن سرور باعث فعال شدن آن می شود + + + تست تکمیل شد + + + اثر انگشت tls پیش فرض + User-Agent این پارامتر فقط برای tcp/http و ws معتبر است + + FontFamily (نیاز به راه اندازی مجدد) + + + فایل TTF/TTC فونت را در دایرکتوری guiFonts کپی کنید. پنجره تنظیمات را دوباره باز کنید + + + پورت Pac = +3; پورت Xray API = +4; پورت mihomo API = +5; + + + این را با امتیازات ادمین تنظیم کنید، پس از راه اندازی، امتیازات مدیر را دریافت کنید + + + اندازه فونت + + + یمقدار تاخیر تست سرعت منفرد + + + /آدرس اینترنتی SpeedTest + + + بالا و پایین حرکت کنید + + + PublicKey + + + ShortId + + + SpiderX + فعال‌ سازی شتاب‌ دهنده سخت‌ افزاری (نیاز به راه‌اندازی مجدد) + + در انتظار آزمایش (برای پایان دادن به ESC فشار دهید)... + + + لطفاً در صورت قطع غیرعادی آن را خاموش کنید + + + به روز رسانی ها فعال نیستند، از این اشتراک رد شوید + + + به عنوان مدیر راه اندازی مجدد + + + نشانی‌های وب بیشتر که با کاما از هم جدا شده‌اند. تبدیل اشتراک نامعتبر خواهد بود + + + {0} : {1}/s↑ | {2}/s↓ + + + فاصله به روز رسانی خودکار (دقیقه) + + + فعال کردن ورود به فایل + + + تبدیل نوع هدف + + + اگر نیازی به تبدیل نیست، لطفاً خالی بگذارید + + + تنظیمات DNS + + + تنظیمات DNS sing-box + + + لطفا ساختار DNS را پر کنید، برای مشاهده سند کلیک کنید + + + برای وارد کردن تنظیمات پیش‌فرض DNS کلیک کنید + + + استراتژی دامنه sing-box + + + پروتکل sing-box Mux + + + نام کامل فرانید (حالت Tun) + + + IP or IP CIDR + + + دامنه + + + Add [Hysteria2] server + + + حداکتر پهنای باند هیستریا (آپلود/دانلود) + + + استفاده کردن از System Hosts + + + افزودن سرور [TUIC] + + + کنترل تراکم + + + نام مستعار پروکسی قبلی + + + نام مستعار پروکسی بعدی + + + لطفاً مطمئن شوید که ملاحظات وجود دارند و منحصر به فرد هستند + + + فعال سازی additional Inbound + + + فعال سازی آدرس IPv6 + + + افزودن سرور [WireGuard] + + + کلید خصوصی + + + Reserved (2,3,4) + + + آدرس (IPv4, IPv6) + + + پسورد obfs + + + (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag + + + خودکار ScrollToEnd + + + آدرس اینترنتی تست پینگ سرعت + + + اشتراک در حال به‌روزرسانی، فقط مشخص کنید که ملاحظاتی آیا وجود دارد! + + + پایان تست... + + + *grpc Authority + + + افزودن سرور [HTTP] + + + از Xray استفاده کنید و حالت non-Tun را فعال کنید، که با پراکسی قبلی گروه در تضاد است + + + فعال کردن فرگمنت + فعال کردن کش فایل مجموعه قوانین برای sing-box + + سفارش سازی مجموعه قوانین sing box + + + عملکرد موفقیت آمیز بود، روی منوی تنظیمات کلیک کنید تا برنامه راه اندازی مجدد شود. + + + باز کردن محل ذخیره سازی + مرتب سازی + + Chain + پیش فرض @@ -963,12 +1161,21 @@ ترافیک دانلود + + هاست + نام + + شبکه + زمان + + نوع + سرعت اپلود @@ -1008,27 +1215,18 @@ تست تاخیر قسمت گره (نقطه اتصال) + + تازه سازی پروکسی ها + انتخاب گره فعال (Enter) - - پشتیبان گیری از راه دور (WebDAV) - - - بازیابی از راه دور (WebDAV) - استراتژی دامنه پیش فرض برای خروجی - - کمترین تأخیر چند سروره - جهت چیدمان اصلی (نیاز به راه اندازی مجدد) - - تعادل بار چند سروره - آدرس DNS خروجی @@ -1056,6 +1254,12 @@ بازیابی از محلی + + پشتیبان گیری از راه دور (WebDAV) + + + بازیابی از راه دور (WebDAV) + محلی @@ -1131,216 +1335,6 @@ یادداشت ملاحظات - - فعال کردن ورود به فایل - - - به روز رسانی ها فعال نیستند، از این اشتراک رد شوید - - - به عنوان مدیر راه اندازی مجدد - - - نشانی‌های وب بیشتر که با کاما از هم جدا شده‌اند. تبدیل اشتراک نامعتبر خواهد بود - - - {0} : {1}/s↑ | {2}/s↓ - - - فاصله به روز رسانی خودکار (دقیقه) - - - تبدیل نوع هدف - - - اگر نیازی به تبدیل نیست، لطفاً خالی بگذارید - - - لطفاً در صورت قطع غیرعادی آن را خاموش کنید - - - تنظیمات DNS - - - لطفا ساختار DNS را پر کنید، برای مشاهده سند کلیک کنید - - - برای وارد کردن تنظیمات پیش‌فرض DNS کلیک کنید - - - استراتژی دامنه sing-box - - - پروتکل sing-box Mux - - - نام کامل فرانید (حالت Tun) - - - IP or IP CIDR - - - دامنه - - - تنظیمات DNS sing-box - - - در انتظار آزمایش (برای پایان دادن به ESC فشار دهید)... - - - SpiderX - - - ShortId - - - انتقال به گروه - - - فعال کردن مرتب‌سازی سرورها با کشیدن و رها کردن (نیاز به راه‌اندازی مجدد) - - - بازخوانی خودکار - - - رد شدن از آزمون - - - ویرایش سرور (Ctrl+D) - - - دوبار کلیک کردن سرور باعث فعال شدن آن می شود - - - تست تکمیل شد - - - اثر انگشت tls پیش فرض - - - FontFamily (نیاز به راه اندازی مجدد) - - - فایل TTF/TTC فونت را در دایرکتوری guiFonts کپی کنید. پنجره تنظیمات را دوباره باز کنید - - - پورت Pac = +3; پورت Xray API = +4; پورت mihomo API = +5; - - - این را با امتیازات ادمین تنظیم کنید، پس از راه اندازی، امتیازات مدیر را دریافت کنید - - - اندازه فونت - - - یمقدار تاخیر تست سرعت منفرد - - - /آدرس اینترنتی SpeedTest - - - بالا و پایین حرکت کنید - - - PublicKey - - - Add [Hysteria2] server - - - حداکتر پهنای باند هیستریا (آپلود/دانلود) - - - افزودن سرور [TUIC] - - - اشتراک در حال به‌روزرسانی، فقط مشخص کنید که ملاحظاتی آیا وجود دارد! - - - تازه سازی پروکسی ها - - - شبکه - - - نوع - - - *grpc Authority - - - افزودن سرور [HTTP] - - - آدرس اینترنتی تست پینگ سرعت - - - از Xray استفاده کنید و حالت non-Tun را فعال کنید، که با پراکسی قبلی گروه در تضاد است - - - سفارش سازی مجموعه قوانین sing box - - - عملکرد موفقیت آمیز بود، روی منوی تنظیمات کلیک کنید تا برنامه راه اندازی مجدد شود. - - - باز کردن محل ذخیره سازی - - - Chain - - - هاست - - - استفاده کردن از System Hosts - - - فعال کردن فرگمنت - - - خودکار ScrollToEnd - - - پایان تست... - - - نام مستعار پروکسی بعدی - - - پسورد obfs - - - کنترل تراکم - - - نام مستعار پروکسی قبلی - - - آدرس (IPv4, IPv6) - - - Reserved (2,3,4) - - - کلید خصوصی - - - افزودن سرور [WireGuard] - - - فعال سازی آدرس IPv6 - - - فعال سازی additional Inbound - - - لطفاً مطمئن شوید که ملاحظات وجود دارند و منحصر به فرد هستند - - - (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag - رمز عبور sudo سیستم @@ -1401,4 +1395,22 @@ مخفی و پورت می شود، با کاما (،) جدا می شود + + چند سرور Xray (چند انتخابی) + + + چند سرور تصادفی + + + چند سرور گردشی + + + چند سرور کمترین تأخیر + + + چند سرور پایدارترین + + + چند سرور کمترین تأخیر sing-box (چند انتخابی) + diff --git a/v2rayN/ServiceLib/Resx/ResUI.hu.resx b/v2rayN/ServiceLib/Resx/ResUI.hu.resx index ba5991bf..c6529357 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.hu.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.hu.resx @@ -1224,15 +1224,9 @@ Alapértelmezett domain stratégia a kimenő forgalomhoz - - Multi-szerver alacsony késleltetés - Fő elrendezés irányítása (indítás szükséges) - - Multi-szerver terheléselosztás - Kimenő DNS cím @@ -1401,4 +1395,22 @@ Will cover the port, separate with commas (,) + + Többszerveres Xray (többválasztásos) + + + Többszerveres véletlenszerű + + + Többszerveres körforgásos + + + Többszerveres legkisebb késleltetésű + + + Többszerveres legstabilabb + + + Többszerveres legkisebb késleltetésű sing-box (többválasztásos) + diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx index 3199bce4..f1b3133f 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1224,15 +1224,9 @@ Default domain strategy for outbound - - Multi-Server lowest latency - Main layout orientation (requires restart) - - Multi-server load balancing - Outbound DNS address @@ -1401,4 +1395,22 @@ Will cover the port, separate with commas (,) - \ No newline at end of file + + Multi-Server Xray + + + Multi-Server Random + + + Multi-Server RoundRobin + + + Multi-Server LeastPing + + + Multi-Server LeastLoad + + + Multi-Server lowest latency sing-box + + diff --git a/v2rayN/ServiceLib/Resx/ResUI.ru.resx b/v2rayN/ServiceLib/Resx/ResUI.ru.resx index a2d3016b..b740f033 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.ru.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.ru.resx @@ -681,18 +681,12 @@ Интервал автоматического обновления Geo в часах - - Интервал автоматического обновления в минутах - Ядро: базовые настройки Настройки DNS V2ray - - Настройки DNS sing-box - Ядро: настройки KCP @@ -978,137 +972,146 @@ Скопируйте файл шрифта TTF/TTC в каталог guiFonts, перезапустите настройки + + Pac порт = +3; Xray API порт = +4; mihomo API порт = +5; + Установите это с правами администратора Размер шрифта - - Включить аппаратное ускорение (требуется перезагрузка) - - - Перезагрузить как администратор - - - Настройки DNS - - - Включить логгирование в файл - Таймаут одиночного спидтеста URL спидтеста - - Источник geo файлов + + Move up and down - - Источник sing-box srs файлов + + PublicKey - - Источник правил маршрутизации + + ShortId - - Региональные пресеты + + SpiderX - - По умолчанию (Китай) + + Включить аппаратное ускорение (требуется перезагрузка) - - Россия + + Ожидание тестирования (нажмите ESC для отмены)... - - Иран + + Please turn off when there is an abnormal disconnection - - Используйте Настройки -> Региональные пресеты вместо изменения этого поля + + Updates are not enabled, skip this subscription - - Remarks Memo + + Перезагрузить как администратор - - URL-адрес для проверки скорости пинга + + More URLs, separated by commas; Subscription conversion will be invalid - - Part Node Latency Test + + {0} : {1}/s↑ | {2}/s↓ - - Обновить прокси + + Интервал автоматического обновления в минутах - - Автоматическая прокрутка в конец + + Включить логгирование в файл - - Активировать узел (Enter) + + Преобразовать тип цели - - (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag + + Если преобразование не требуется, оставьте поле пустым. - - obfs password + + Настройки DNS - - Адрес(Ipv4,Ipv6) + + Настройки DNS sing-box - - Стратегия домена по умолчанию для исходящих + + Пожалуйста, заполните структуру DNS. Нажмите, чтобы просмотреть документ. - - Multi-Server lowest latency + + Нажмите, чтобы импортировать конфигурацию DNS по умолчанию - - Основная ориентация макета (требуется перезагрузка) + + Стратегия домена для sing-box - - Multi-server load balancing + + sing-box Mux Protocol - - Тест задержки + + Full process name (Tun mode) - - Reserved(2,3,4) + + IP or IP CIDR - - PrivateKey + + Домен - - Добавить [WireGuard] сервер + + Добавить [Hysteria2] сервер - - Автоматическая регулировка ширины столбца + + Hysteria Max bandwidth (Up/Dw) - - Export Base64-encoded Share Links to Clipboard + + Использовать системные узлы - - Задержка - - - Enable additional Inbound - - - Пожалуйста, убедитесь, что примечание существует и является уникальным. - - - Экспортировать выбранный сервер для полной конфигурации в буфер обмена - - - Next proxy remarks - - - Показать или скрыть главное окно - - - Previous proxy remarks + + Добавить [TUIC] сервер Контроль перегрузок - - Исходящий DNS адрес + + Previous proxy remarks + + + Next proxy remarks + + + Пожалуйста, убедитесь, что примечание существует и является уникальным. + + + Enable additional Inbound + + + Включить IPv6 адреса + + + Добавить [WireGuard] сервер + + + PrivateKey + + + Reserved(2,3,4) + + + Адрес(Ipv4,Ipv6) + + + obfs password + + + (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag + + + Автоматическая прокрутка в конец + + + URL-адрес для проверки скорости пинга Updating subscription, only determine remarks exists @@ -1119,23 +1122,41 @@ *grpc Authority - - По умолчанию + + Добавить [HTTP] сервер - - Chain + + Use Xray and enable non-Tun mode, which conflicts with the group previous proxy - - Сортировка + + Включить фрагмент - - Открыть место хранения + + Включить файл кэша для sing-box (файлы наборов правил) + + + Пользовательский набор правил для sing-box Successful operation. Click the settings menu to reboot the app. - - Пользовательский набор правил для sing-box + + Открыть место хранения + + + Сортировка + + + Chain + + + По умолчанию + + + Задержка + + + Скорость загрузки Download Traffic @@ -1155,9 +1176,6 @@ Тип - - Включить файл кэша для sing-box (файлы наборов правил) - Скорость загрузки @@ -1188,158 +1206,134 @@ Do not change - - Включить фрагмент - - - Use Xray and enable non-Tun mode, which conflicts with the group previous proxy - Правила - - Добавить [HTTP] сервер + + Тест задержки - - Добавить [TUIC] сервер + + Part Node Latency Test - - Включить IPv6 адреса + + Обновить прокси + + + Активировать узел (Enter) + + + Стратегия домена по умолчанию для исходящих + + + Основная ориентация макета (требуется перезагрузка) + + + Исходящий DNS адрес + + + Автоматическая регулировка ширины столбца + + + Export Base64-encoded Share Links to Clipboard + + + Экспортировать выбранный сервер для полной конфигурации в буфер обмена + + + Показать или скрыть главное окно Пользовательская конфигурация порта socks + + Резервное копирование и восстановление + + + Сохранить в файл + + + Восстановить из файла + + + Backup to remote (WebDAV) + + + Restore from remote (WebDAV) + + + Local + + + Remote (WebDAV) + + + WebDav Url + + + WebDav User Name + + + WebDav Password + WebDav Check - - Домен - - - IP or IP CIDR - - - Full process name (Tun mode) - - - sing-box Mux Protocol + + Имя удаленной папки (необязательно) Неверный файл резервной копии - - Стратегия домена для sing-box - Host filter - - Нажмите, чтобы импортировать конфигурацию DNS по умолчанию - Active - - Пожалуйста, заполните структуру DNS. Нажмите, чтобы просмотреть документ. + + Источник geo файлов - - Если преобразование не требуется, оставьте поле пустым. - - - Преобразовать тип цели - - - {0} : {1}/s↑ | {2}/s↓ - - - More URLs, separated by commas; Subscription conversion will be invalid - - - Updates are not enabled, skip this subscription + + Источник sing-box srs файлов Программы для обновления не существует + + Источник правил маршрутизации + + + Региональные пресеты + + + По умолчанию (Китай) + + + Россия + + + Иран + + + Используйте Настройки -> Региональные пресеты вместо изменения этого поля + Сканировать QR-код с изображения - - Please turn off when there is an abnormal disconnection - - - Ожидание тестирования (нажмите ESC для отмены)... - - - SpiderX - - - ShortId - Неверный адрес (Url) Пожалуйста, не используйте небезопасный адрес подписки по протоколу HTTP. - - PublicKey - - - Move up and down - - - Pac порт = +3; Xray API порт = +4; mihomo API порт = +5; - Установите шрифт в систему и перезапустите настройки - - Добавить [Hysteria2] сервер - - - WebDav Password - - - Имя удаленной папки (необязательно) - - - Скорость загрузки - - - Restore from remote (WebDAV) - - - Backup to remote (WebDAV) - - - WebDav User Name - - - Восстановить из файла - - - Сохранить в файл - - - Использовать системные узлы - - - Резервное копирование и восстановление - - - Local - Вы уверены, что хотите выйти? - - Hysteria Max bandwidth (Up/Dw) - - - WebDav Url - - - Remote (WebDAV) + + Remarks Memo System sudo password @@ -1401,4 +1395,22 @@ Will cover the port, separate with commas (,) - + + Мультисерверный Xray (множественный выбор) + + + Мультисерверный случайный + + + Мультисерверный круговой + + + Мультисерверная минимальная задержка + + + Мультисерверный наиболее стабильный + + + Мультисерверная минимальная задержка sing-box (множественный выбор) + + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index 79ffe7b6..0b1cb9e1 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1050,12 +1050,12 @@ 进程名全称 (Tun 模式) - - Domain - IP 或 IP CIDR + + Domain + 添加 [Hysteria2] 服务器 @@ -1122,12 +1122,12 @@ 添加 [HTTP] 服务器 - - 启用分片(Fragment) - 使用 Xray 且非 Tun 模式启用,和分组前置代理冲突 + + 启用分片(Fragment) + 启用 sing-box(规则集文件)的缓存文件 @@ -1221,15 +1221,9 @@ Outbound 默认解析策略 - - 多服务器最低延迟 (多选) - 主界面布局方向(需重启) - - 多服务器负载均衡 (多选) - Outbound 域名解析地址 @@ -1269,17 +1263,17 @@ 远程 (WebDAV) + + WebDav 服务器地址 + WebDav 账户 - - WebDav 可用检查 - WebDav 密码 - - WebDav 服务器地址 + + WebDav 可用检查 远程文件夹名称 (可选) @@ -1296,18 +1290,15 @@ Geo 文件来源 (可选) - - 升级工具 App 不存在 - sing-box ruleset 文件来源 (可选) + + 升级工具 App 不存在 + 路由规则集来源 (可选) - - 中国区域用户可忽略此项 - 区域预置设置 @@ -1320,6 +1311,9 @@ 伊朗 + + 中国区域用户可忽略此项 + 扫描图片中的二维码 @@ -1398,4 +1392,22 @@ 会覆盖端口,多组时用逗号 (,) 隔开 - \ No newline at end of file + + 多服务器 Xray (多选) + + + 多服务器随机 + + + 多服务器轮询 + + + 多服务器最低延迟 + + + 多服务器最稳定 + + + 多服务器最低延迟 sing-box (多选) + + diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index 241b1ac2..86f9fa1f 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -663,7 +663,6 @@ *自訂設定的 Socks 埠值,可不設定;當設定此值後,將使用 Xray/sing-box (Tun) 額外啟動一個前置 Socks 服務,提供分流和速度顯示等功能 - 瀏覽 @@ -1051,15 +1050,27 @@ 行程名全稱 (Tun 模式) - - Domain - IP 或 IP CIDR + + Domain + + + 添加 [Hysteria2] 伺服器 + + + Hysteria 最大頻寬 (Up/Dw) + + + 使用系統 hosts + 新增 [TUIC] 伺服器 + + 擁塞控制算法 + 前置代理別名 @@ -1075,6 +1086,21 @@ 啟用 IPv6 + + 添加 [WireGuard] 伺服器 + + + PrivateKey + + + Reserved (2,3,4) + + + Address (Ipv4,Ipv6) + + + 混淆密碼 (obfs password) + (Domain 或 IP 或 行程名) 与 Port 与 Protocol 与 InboundTag => OutboundTag @@ -1096,12 +1122,12 @@ 新增 [HTTP] 伺服器 - - 啟用分片(Fragment) - 使用 Xray 且非 Tun 模式啟用,和分組前置代理衝突 + + 啟用分片(Fragment) + 啟用 sing-box(規則集檔案)的快取檔案 @@ -1114,6 +1140,93 @@ 打開儲存所在的位置 + + 排序 + + + 路由鏈 + + + 預設 + + + 延遲 + + + 下載速度 + + + 下載流量 + + + 主機 + + + 名稱 + + + 網路 + + + 時間 + + + 類型 + + + 上傳速度 + + + 上傳流量 + + + 目前連線 + + + 關閉連線 + + + 關閉所有連線 + + + 目前代理 + + + 規則模式 + + + 直連 + + + 全局 + + + 随原配置 + + + 規則 + + + 延遲測試 + + + 目前部分節點延遲測試 + + + 重新整理 + + + 設為活動節點 (Enter) + + + Outbound 預設解析策略 + + + 主界面佈局方向 (需重啟) + + + Outbound 域名解析位址 + 自動調整列寬 @@ -1150,17 +1263,17 @@ 遠端 (WebDAV) + + WebDav 伺服器位址 + WebDav 賬戶 - - WebDav 可用檢查 - WebDav 密碼 - - WebDav 伺服器位址 + + WebDav 可用檢查 遠端資料夾名稱 (可選) @@ -1177,18 +1290,15 @@ Geo 檔案來源 (可選) - - 升級工具 App 不存在 - sing-box ruleset 檔案來源 (可選) + + 升級工具 App 不存在 + 路由規則集來源 (可選) - - 中國區域用戶可忽略此項 - 區域預置設定 @@ -1201,6 +1311,9 @@ 伊朗 + + 中國區域用戶可忽略此項 + 掃描圖片中的二維碼 @@ -1219,126 +1332,6 @@ 備註備忘 - - 擁塞控制算法 - - - 設為活動節點 (Enter) - - - 重新整理 - - - 排序 - - - 延遲測試 - - - 規則 - - - 随原配置 - - - 全局 - - - 直連 - - - 規則模式 - - - 目前代理 - - - 關閉所有連線 - - - Outbound 預設解析策略 - - - 關閉連線 - - - 上傳流量 - - - 上傳速度 - - - 類型 - - - 時間 - - - 網路 - - - 名稱 - - - 主機 - - - 下載流量 - - - 下載速度 - - - 延遲 - - - 預設 - - - 目前連線 - - - 多伺服器最低延遲 (多選) - - - 目前部分節點延遲測試 - - - 多伺服器負載平衡 (多選) - - - 添加 [Hysteria2] 伺服器 - - - Hysteria 最大頻寬 (Up/Dw) - - - 主界面佈局方向 (需重啟) - - - 添加 [WireGuard] 伺服器 - - - PrivateKey - - - Reserved (2,3,4) - - - Address (Ipv4,Ipv6) - - - 使用系統 hosts - - - 路由鏈 - - - Outbound 域名解析位址 - - - 混淆密碼 (obfs password) - 系統的 sudo 密碼 @@ -1399,4 +1392,22 @@ 會覆蓋端口,多組時用逗號 (,) 隔開 + + 多伺服器 Xray (多選) + + + 多伺服器隨機 + + + 多伺服器輪詢 + + + 多伺服器最低延遲 + + + 多伺服器最穩定 + + + 多伺服器最低延遲 sing-box (多選) + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs index f41da883..4c2cbde6 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs @@ -77,16 +77,6 @@ namespace ServiceLib.Services.CoreConfig } } - public async Task GenerateClientMultipleRoundRobinConfig(List selecteds) - { - return await GenerateClientMultipleLoadConfig(selecteds, EMultipleLoad.RoundRobin); - } - - public async Task GenerateClientMultipleLeastPingConfig(List selecteds) - { - return await GenerateClientMultipleLoadConfig(selecteds, EMultipleLoad.LeastPing); - } - public async Task GenerateClientMultipleLoadConfig(List selecteds, EMultipleLoad multipleLoad) { var ret = new RetResult(); @@ -174,14 +164,7 @@ namespace ServiceLib.Services.CoreConfig } //add balancers - if (multipleLoad == EMultipleLoad.RoundRobin) - { - await GenRoundRobinBalancer(v2rayConfig); - } - else - { - await GenLeastPingBalancer(v2rayConfig); - } + await GenBalancer(v2rayConfig, multipleLoad); var balancer = v2rayConfig.routing.balancers.First(); @@ -1329,34 +1312,33 @@ namespace ServiceLib.Services.CoreConfig return 0; } - private async Task GenRoundRobinBalancer(V2rayConfig v2rayConfig) + private async Task GenBalancer(V2rayConfig v2rayConfig, EMultipleLoad multipleLoad) { - var balancer = new BalancersItem4Ray + if (multipleLoad is EMultipleLoad.LeastLoad or EMultipleLoad.LeastPing) { - selector = [Global.ProxyTag], - strategy = new() { type = "roundRobin" }, - tag = $"{Global.ProxyTag}-round", - }; - v2rayConfig.routing.balancers = [balancer]; - return await Task.FromResult(0); - } - - private async Task GenLeastPingBalancer(V2rayConfig v2rayConfig) - { - var observatory = new Observatory4Ray + var observatory = new Observatory4Ray + { + subjectSelector = [Global.ProxyTag], + probeUrl = AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl, + probeInterval = "3m" + }; + v2rayConfig.observatory = observatory; + } + var strategyType = multipleLoad switch { - subjectSelector = [Global.ProxyTag], - probeUrl = AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl, - probeInterval = "3m" + EMultipleLoad.Random => "random", + EMultipleLoad.RoundRobin => "roundRobin", + EMultipleLoad.LeastPing => "leastPing", + EMultipleLoad.LeastLoad => "leastLoad", + _ => "roundRobin", }; var balancer = new BalancersItem4Ray { selector = [Global.ProxyTag], - strategy = new() { type = "leastPing" }, + strategy = new() { type = strategyType }, tag = $"{Global.ProxyTag}-round", }; v2rayConfig.routing.balancers = [balancer]; - v2rayConfig.observatory = observatory; return await Task.FromResult(0); } diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index 6688cd9b..3ca62c37 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -62,6 +62,11 @@ namespace ServiceLib.ViewModels public ReactiveCommand CopyServerCmd { get; } public ReactiveCommand SetDefaultServerCmd { get; } public ReactiveCommand ShareServerCmd { get; } + public ReactiveCommand SetDefaultMultipleServerXrayRandomCmd { get; } + public ReactiveCommand SetDefaultMultipleServerXrayRoundRobinCmd { get; } + public ReactiveCommand SetDefaultMultipleServerXrayLeastPingCmd { get; } + public ReactiveCommand SetDefaultMultipleServerXrayLeastLoadCmd { get; } + public ReactiveCommand SetDefaultMultipleServerSingBoxLeastPingCmd { get; } public ReactiveCommand SetDefaultMultipleServerCmd { get; } public ReactiveCommand SetDefaultLoadBalanceServerCmd { get; } @@ -150,13 +155,25 @@ namespace ServiceLib.ViewModels { await ShareServerAsync(); }, canEditRemove); - SetDefaultMultipleServerCmd = ReactiveCommand.CreateFromTask(async () => + SetDefaultMultipleServerXrayRandomCmd = ReactiveCommand.CreateFromTask(async () => { - await SetDefaultMultipleServer(EMultipleLoad.LeastPing); + await SetDefaultMultipleServer(ECoreType.Xray, EMultipleLoad.Random); }, canEditRemove); - SetDefaultLoadBalanceServerCmd = ReactiveCommand.CreateFromTask(async () => + SetDefaultMultipleServerXrayRoundRobinCmd = ReactiveCommand.CreateFromTask(async () => { - await SetDefaultMultipleServer(EMultipleLoad.RoundRobin); + await SetDefaultMultipleServer(ECoreType.Xray, EMultipleLoad.RoundRobin); + }, canEditRemove); + SetDefaultMultipleServerXrayLeastPingCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultMultipleServer(ECoreType.Xray, EMultipleLoad.LeastPing); + }, canEditRemove); + SetDefaultMultipleServerXrayLeastLoadCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultMultipleServer(ECoreType.Xray, EMultipleLoad.LeastLoad); + }, canEditRemove); + SetDefaultMultipleServerSingBoxLeastPingCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultMultipleServer(ECoreType.sing_box, EMultipleLoad.LeastPing); }, canEditRemove); //servers move @@ -621,7 +638,7 @@ namespace ServiceLib.ViewModels await _updateView?.Invoke(EViewAction.ShareServer, url); } - private async Task SetDefaultMultipleServer(EMultipleLoad multipleLoad) + private async Task SetDefaultMultipleServer(ECoreType coreType, EMultipleLoad multipleLoad) { var lstSelected = await GetProfileItems(true); if (lstSelected == null) @@ -629,7 +646,7 @@ namespace ServiceLib.ViewModels return; } - var ret = await ConfigHandler.AddCustomServer4Multiple(_config, lstSelected, multipleLoad); + var ret = await ConfigHandler.AddCustomServer4Multiple(_config, lstSelected, coreType, multipleLoad); if (ret.Success != true) { NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml index 0288a00e..4524934d 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml @@ -99,8 +99,13 @@ - - + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index ada0b3c3..474c2e37 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -67,8 +67,11 @@ namespace v2rayN.Desktop.Views this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayRandomCmd, v => v.menuSetDefaultMultipleServerXrayRandom).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayRoundRobinCmd, v => v.menuSetDefaultMultipleServerXrayRoundRobin).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayLeastPingCmd, v => v.menuSetDefaultMultipleServerXrayLeastPing).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayLeastLoadCmd, v => v.menuSetDefaultMultipleServerXrayLeastLoad).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerSingBoxLeastPingCmd, v => v.menuSetDefaultMultipleServerSingBoxLeastPing).DisposeWith(disposables); //servers move //this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml b/v2rayN/v2rayN/Views/ProfilesView.xaml index d2e6cd75..1dc8e65e 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml @@ -120,15 +120,28 @@ Height="{StaticResource MenuItemHeight}" Header="{x:Static resx:ResUI.menuShareServer}" /> + + + + + + - - + Header="{x:Static resx:ResUI.menuSetDefaultMultipleServerSingBoxLeastPing}" /> vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayRandomCmd, v => v.menuSetDefaultMultipleServerXrayRandom).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayRoundRobinCmd, v => v.menuSetDefaultMultipleServerXrayRoundRobin).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayLeastPingCmd, v => v.menuSetDefaultMultipleServerXrayLeastPing).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerXrayLeastLoadCmd, v => v.menuSetDefaultMultipleServerXrayLeastLoad).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerSingBoxLeastPingCmd, v => v.menuSetDefaultMultipleServerSingBoxLeastPing).DisposeWith(disposables); //servers move this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables);