Compare commits

...

21 Commits
7.5.2 ... 7.5.6

Author SHA1 Message Date
2dust
27c53be209 up 7.5.6 2025-01-08 14:16:30 +08:00
2dust
d93c12b354 Add more options to xray fragment 2025-01-08 13:52:21 +08:00
2dust
98d4a47efb Fix Mux for XUDP
https://github.com/2dust/v2rayN/issues/6446
2025-01-07 20:16:05 +08:00
2dust
8ab04c65b5 Update README.md 2025-01-07 14:33:15 +08:00
2dust
1b2dab1388 Bug fix
https://github.com/2dust/v2rayN/issues/6448
2025-01-07 11:28:46 +08:00
2dust
4f8dae7fa0 Add the mixed option in Stack in Tun mode settings
https://github.com/2dust/v2rayN/issues/6441
2025-01-06 20:46:07 +08:00
Harry Huang
cdc23e32c4 Fix zh-Hans and zh-Hant translation style (#6443)
* Fix zh-Hans i10n translation style

* Fix zh-Hant i10n translation style
2025-01-06 19:05:43 +08:00
2dust
20457e9e63 up 7.5.5 2025-01-05 19:10:57 +08:00
2dust
e63042af84 Bug fix for fontsize 2025-01-05 19:10:12 +08:00
2dust
c35b4d3c1b up 7.5.4 2025-01-05 17:58:55 +08:00
2dust
64a83a5d64 down PackageReference 2025-01-05 17:58:23 +08:00
2dust
01039d0b47 up 7.5.3 2025-01-05 17:31:32 +08:00
2dust
7c1e5a3cba Fixed possible crash issues 2025-01-05 17:12:51 +08:00
2dust
038161527f Buf fix for CurrentFontSize 2025-01-05 17:11:32 +08:00
2dust
b12b7a17e6 Fix possible issues with load balancing 2025-01-05 16:31:32 +08:00
2dust
37cf23d5fe up PackageReference 2025-01-05 15:01:15 +08:00
2dust
ed7fb4f6e3 Code clean 2025-01-05 14:50:31 +08:00
2dust
5d4bd2fee6 Fix possible issues with load balancing
https://github.com/2dust/v2rayN/issues/6429
2025-01-05 14:49:53 +08:00
2dust
aae5906311 Fix GetListNetworkServices 2025-01-05 12:24:14 +08:00
2dust
4a7bafd011 Fix Linux restore backup function
Fixed the issue that the guiNConfig.json file cannot be restored in the backup and restore function
2025-01-05 10:22:18 +08:00
2dust
626ebfe65d Improved ModifyFontSize 2025-01-04 20:42:42 +08:00
28 changed files with 213 additions and 177 deletions

View File

@@ -22,7 +22,7 @@ Fedora 30+
### macOS
- `chmod +x v2rayN` Run `./v2rayN` under user permissions
```
macOS 10.14+
macOS 11+
```
## Requirements

View File

@@ -81,6 +81,7 @@ public static class ProcUtils
return;
}
var procId = review ? proc?.Id : null;
var fileName = review ? proc?.MainModule?.FileName : null;
var processName = review ? proc?.ProcessName : null;
@@ -90,15 +91,27 @@ public static class ProcUtils
try { proc?.Dispose(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); }
await Task.Delay(300);
if (review && fileName != null)
if (review && procId != null && fileName != null)
{
var proc2 = Process.GetProcessesByName(processName)
.FirstOrDefault(t => t.MainModule?.FileName == fileName);
if (proc2 != null)
try
{
Logging.SaveLog($"{_tag}, KillProcess not completing the job");
await ProcessKill(proc2, false);
proc2 = null;
var lstProc = Process.GetProcessesByName(processName);
foreach (var proc2 in lstProc)
{
if (proc2.Id == procId)
{
Logging.SaveLog($"{_tag}, KillProcess not completing the job, procId");
await ProcessKill(proc2, false);
}
if (proc2.MainModule != null && proc2.MainModule?.FileName == fileName)
{
Logging.SaveLog($"{_tag}, KillProcess not completing the job, fileName");
}
}
}
catch (Exception ex)
{
Logging.SaveLog(_tag, ex);
}
}
}

View File

@@ -5,6 +5,7 @@ namespace ServiceLib.Common
internal static class WindowsUtils
{
private static readonly string _tag = "WindowsUtils";
public static string? RegReadValue(string path, string name, string def)
{
RegistryKey? regKey = null;

View File

@@ -209,7 +209,7 @@
public static readonly List<string> RuleNetworks = new() { "", "tcp", "udp", "tcp,udp" };
public static readonly List<string> destOverrideProtocols = ["http", "tls", "quic", "fakedns", "fakedns+others"];
public static readonly List<string> TunMtus = new() { "1280", "1408", "1500", "9000" };
public static readonly List<string> TunStacks = new() { "gvisor", "system" };
public static readonly List<string> TunStacks = new() { "gvisor", "system", "mixed" };
public static readonly List<string> PresetMsgFilters = new() { "proxy", "direct", "block", "" };
public static readonly List<string> SingboxMuxs = new() { "h2mux", "smux", "yamux", "" };
public static readonly List<string> TuicCongestionControls = new() { "cubic", "new_reno", "bbr" };

View File

@@ -156,6 +156,12 @@ namespace ServiceLib.Handler
config.SystemProxyItem ??= new();
config.WebDavItem ??= new();
config.CheckUpdateItem ??= new();
config.Fragment4RayItem ??= new()
{
Packets = "tlshello",
Length = "100-200",
Interval = "10-20"
};
if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions))
{
@@ -1870,7 +1876,7 @@ namespace ServiceLib.Handler
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[1] + "sing_box.json"));
return true;
case EPresetType.Iran:
config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[2];
config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[2];

View File

@@ -1,6 +1,4 @@
using YamlDotNet.Core.Tokens;
namespace ServiceLib.Handler
namespace ServiceLib.Handler
{
/// <summary>
/// Core configuration file processing class

View File

@@ -93,8 +93,9 @@
{
return LstInterface;
}
var lst = services.Split(Environment.NewLine);
return lst.Length > 0 ? LstInterface.Intersect(lst).ToList() : LstInterface;
var lst = services.Split(Environment.NewLine).Where(t => t.Length > 0 && t.Contains('*') == false);
return lst.ToList();
}
}
}

View File

@@ -3,6 +3,7 @@
public static class SysProxyHandler
{
private static readonly string _tag = "SysProxyHandler";
public static async Task<bool> UpdateSysProxy(Config config, bool forceDisable)
{
var type = config.SystemProxyItem.SysProxyType;

View File

@@ -14,7 +14,6 @@ namespace ServiceLib.Handler
private string _webDir = Global.AppName + "_backup";
private readonly string _webFileName = "backup.zip";
private readonly string _tag = "WebDav--";
public WebDavHandler()
{

View File

@@ -47,6 +47,7 @@
public SystemProxyItem SystemProxyItem { get; set; }
public WebDavItem WebDavItem { get; set; }
public CheckUpdateItem CheckUpdateItem { get; set; }
public Fragment4RayItem? Fragment4RayItem { get; set; }
public List<InItem> Inbound { get; set; }
public List<KeyEventItem> GlobalHotkeys { get; set; }
public List<CoreTypeItem> CoreTypeItem { get; set; }

View File

@@ -246,4 +246,12 @@
public bool CheckPreReleaseUpdate { get; set; }
public List<string>? SelectedCoreTypes { get; set; }
}
[Serializable]
public class Fragment4RayItem
{
public string? Packets { get; set; }
public string? Length { get; set; }
public string? Interval { get; set; }
}
}

View File

@@ -127,7 +127,7 @@
<value>配置格式不正确</value>
</data>
<data name="CustomServerTips" xml:space="preserve">
<value>注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。如需使用系统代理请手动修改监听端口。</value>
<value>注意自定义配置完全依赖您自己的配置,不能使用所有设置功能。如需使用系统代理请手动修改监听端口。</value>
</data>
<data name="Downloading" xml:space="preserve">
<value>下载开始...</value>
@@ -136,7 +136,7 @@
<value>下载</value>
</data>
<data name="DownloadYesNo" xml:space="preserve">
<value>是否下载? {0}</value>
<value>是否下载{0}</value>
</data>
<data name="FailedConversionConfiguration" xml:space="preserve">
<value>转换配置文件失败</value>
@@ -154,7 +154,7 @@
<value>读取配置文件失败</value>
</data>
<data name="FillCorrectServerPort" xml:space="preserve">
<value>请填写正确格式服务器端口</value>
<value>请填写正确格式服务器端口</value>
</data>
<data name="FillLocalListeningPort" xml:space="preserve">
<value>请填写本地监听端口</value>
@@ -169,16 +169,16 @@
<value>请填写用户ID</value>
</data>
<data name="Incorrectconfiguration" xml:space="preserve">
<value>不是正确的配置,请检查</value>
<value>配置不正确,请检查</value>
</data>
<data name="InitialConfiguration" xml:space="preserve">
<value>初始化配置</value>
</data>
<data name="IsLatestCore" xml:space="preserve">
<value>{0} {1} 已是最新版本</value>
<value>{0} {1} 已是最新版本</value>
</data>
<data name="IsLatestN" xml:space="preserve">
<value>{0} {1} 已是最新版本</value>
<value>{0} {1} 已是最新版本</value>
</data>
<data name="LvAddress" xml:space="preserve">
<value>地址</value>
@@ -226,7 +226,7 @@
<value>未设置有效的订阅</value>
</data>
<data name="MsgParsingSuccessfully" xml:space="preserve">
<value>解析{0}成功</value>
<value>解析 {0} 成功</value>
</data>
<data name="MsgStartGettingSubscriptions" xml:space="preserve">
<value>开始获取订阅内容</value>
@@ -259,10 +259,10 @@
<value>在文件夹 ({0}) 下未找到Core文件 (文件名:{1}),请下载后放入文件夹,下载地址: {2}</value>
</data>
<data name="NoValidQRcodeFound" xml:space="preserve">
<value>扫描完成,未发现有效二维码</value>
<value>扫描完成未发现有效二维码</value>
</data>
<data name="OperationFailed" xml:space="preserve">
<value>操作失败,请检查重试</value>
<value>操作失败,请检查重试</value>
</data>
<data name="PleaseFillRemarks" xml:space="preserve">
<value>请填写别名</value>
@@ -280,10 +280,10 @@
<value>服务器去重完成。原数量: {0},现数量: {1}</value>
</data>
<data name="RemoveServer" xml:space="preserve">
<value>是否确定移除服务器?</value>
<value>是否确定移除服务器</value>
</data>
<data name="SaveClientConfigurationIn" xml:space="preserve">
<value>客户端配置文件保存在:{0}</value>
<value>客户端配置文件保存在{0}</value>
</data>
<data name="StartService" xml:space="preserve">
<value>启动服务({0})...</value>
@@ -311,10 +311,10 @@
<value>请先选择规则</value>
</data>
<data name="RemoveRules" xml:space="preserve">
<value>是否确定移除规则?</value>
<value>是否确定移除规则</value>
</data>
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
<value>{0},必填其中一项.</value>
<value>{0}必填其中一项.</value>
</data>
<data name="LvRemarks" xml:space="preserve">
<value>别名</value>
@@ -329,10 +329,10 @@
<value>请填写Url</value>
</data>
<data name="AddBatchRoutingRulesYesNo" xml:space="preserve">
<value>是否追加规则?选择则追加,选择否则替换</value>
<value>是否追加规则选择“是”则追加选择“否”则全部替换</value>
</data>
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
<value>下载 GeoFile: {0} 成功</value>
<value>下载 GeoFile{0} 成功</value>
</data>
<data name="MsgInformationTitle" xml:space="preserve">
<value>信息</value>
@@ -386,7 +386,7 @@
<value>*Kcp seed</value>
</data>
<data name="RegisterGlobalHotkeyFailed" xml:space="preserve">
<value>注册全局热键 {0} 失败,原因 {1}</value>
<value>注册全局热键 {0} 失败原因{1}</value>
</data>
<data name="RegisterGlobalHotkeySuccessfully" xml:space="preserve">
<value>注册全局热键 {0} 成功</value>
@@ -485,10 +485,10 @@
<value>暗黑模式</value>
</data>
<data name="TbSettingsFollowSystemTheme" xml:space="preserve">
<value>是否跟随系统主题</value>
<value>跟随系统主题</value>
</data>
<data name="TbSettingsLanguage" xml:space="preserve">
<value>语言(重启)</value>
<value>语言(重启)</value>
</data>
<data name="menuAddServerViaClipboard" xml:space="preserve">
<value>从剪贴板导入分享链接 (Ctrl+V)</value>
@@ -638,7 +638,7 @@
<value>传输层安全(TLS)</value>
</data>
<data name="TipNetwork" xml:space="preserve">
<value>*默认tcp,选错会无法连接</value>
<value>*默认tcp选错会无法连接</value>
</data>
<data name="TbCoreType" xml:space="preserve">
<value>Core类型</value>
@@ -671,7 +671,7 @@
<value>Socks端口</value>
</data>
<data name="TipPreSocksPort" xml:space="preserve">
<value>* 自定义配置的Socks端口值可不设置当设置此值后将使用Xray/sing-box(Tun)额外启动一个前置Socks服务提供分流和速度显示等功能</value>
<value>*自定义配置的Socks端口值可不设置当设置此值后将使用Xray/sing-box(Tun)额外启动一个前置Socks服务提供分流和速度显示等功能</value>
</data>
<data name="TbBrowse" xml:space="preserve">
<value>浏览</value>
@@ -680,7 +680,7 @@
<value>编辑</value>
</data>
<data name="TbSettingsAdvancedProtocol" xml:space="preserve">
<value>高级代理设置, 协议选择(可选)</value>
<value>高级代理设置协议选择(可选)</value>
</data>
<data name="TbSettingsAllowLAN" xml:space="preserve">
<value>允许来自局域网的连接</value>
@@ -689,19 +689,19 @@
<value>启动后隐藏窗口</value>
</data>
<data name="TbSettingsAutoUpdateInterval" xml:space="preserve">
<value>自动更新Geo文件的间隔(单位小时)</value>
<value>自动更新Geo文件的间隔(小时)</value>
</data>
<data name="TbSettingsCore" xml:space="preserve">
<value>Core: 基础设置</value>
</data>
<data name="TbSettingsCoreDns" xml:space="preserve">
<value>V2ray DNS设置</value>
<value>v2ray DNS设置</value>
</data>
<data name="TbSettingsCoreKcp" xml:space="preserve">
<value>Core: KCP设置</value>
</data>
<data name="TbSettingsCoreType" xml:space="preserve">
<value>Core类型设置</value>
<value>Core 类型设置</value>
</data>
<data name="TbSettingsDefAllowInsecure" xml:space="preserve">
<value>默认跳过证书验证(allowInsecure)</value>
@@ -719,7 +719,7 @@
<value>例外</value>
</data>
<data name="TbSettingsExceptionTip" xml:space="preserve">
<value>例外. 对于下列字符开头的地址不使用代理配置文件:使用分号(;)分隔</value>
<value>例外对于下列字符开头的地址不使用代理配置文件使用分号(;)分隔</value>
</data>
<data name="TbSettingsHttpPort" xml:space="preserve">
<value>本地http监听端口</value>
@@ -746,7 +746,7 @@
<value>认证密码</value>
</data>
<data name="TbSettingsRemoteDNS" xml:space="preserve">
<value>自定义DNS(可多个,用逗号(,)分隔)</value>
<value>自定义DNS(可多个用逗号(,)分隔)</value>
</data>
<data name="TbSettingsSetUWP" xml:space="preserve">
<value>解除Win10 UWP应用回环代理限制</value>
@@ -791,7 +791,7 @@
<value>全局热键设置</value>
</data>
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
<value>直接按键盘进行设置, 重启后生效</value>
<value>直接按键盘进行设置重启后生效</value>
</data>
<data name="TbNotChangeSystemProxy" xml:space="preserve">
<value>不改变系统代理</value>
@@ -830,7 +830,7 @@
<value>上移 (U)</value>
</data>
<data name="MsgFilterTitle" xml:space="preserve">
<value>过滤器, 支持正则</value>
<value>过滤器(支持正则)</value>
</data>
<data name="menuWebsiteItem" xml:space="preserve">
<value>{0} 官网</value>
@@ -872,7 +872,7 @@
<value>预定义规则集列表</value>
</data>
<data name="TbRoutingTips" xml:space="preserve">
<value>*设置的路由规则,用逗号(,)分隔;正则中的逗号用&lt;COMMA&gt;替代</value>
<value>*设置的路由规则用逗号(,)分隔正则中的逗号用&lt;COMMA&gt;替代</value>
</data>
<data name="menuImportRulesFromClipboard" xml:space="preserve">
<value>从剪贴板中导入规则</value>
@@ -902,13 +902,13 @@
<value>路由规则详情设置</value>
</data>
<data name="TbAutoSort" xml:space="preserve">
<value>保存时Domain, IP, 进程名 自动排序</value>
<value>保存时 Domain, IP, 进程名 自动排序</value>
</data>
<data name="TbRuleobjectDoc" xml:space="preserve">
<value>规则详细说明文档</value>
</data>
<data name="TbDnsObjectDoc" xml:space="preserve">
<value>支持填写DnsObject,JSON格式点击查看文档</value>
<value>支持填写DnsObjectJSON格式点击查看文档</value>
</data>
<data name="SubUrlTips" xml:space="preserve">
<value>普通分组此处请留空</value>
@@ -920,7 +920,7 @@
<value>系统代理设置改变</value>
</data>
<data name="TbSettingsRouteOnly" xml:space="preserve">
<value>RouteOnly</value>
<value>仅限路由(routeOnly)</value>
</data>
<data name="TbSettingsNotProxyLocalAddress" xml:space="preserve">
<value>请勿将代理服务器用于本地Intranet地址</value>
@@ -935,7 +935,7 @@
<value>速度(M/s)</value>
</data>
<data name="FailedToRunCore" xml:space="preserve">
<value>运行Core失败请看日志</value>
<value>运行Core失败看日志</value>
</data>
<data name="LvFilter" xml:space="preserve">
<value>别名正则过滤</value>
@@ -953,7 +953,7 @@
<value>为局域网开启新的端口</value>
</data>
<data name="TbSettingsTunMode" xml:space="preserve">
<value>Tun模式设置</value>
<value>Tun 模式设置</value>
</data>
<data name="menuMoveToGroup" xml:space="preserve">
<value>移至订阅分组</value>
@@ -1373,7 +1373,7 @@
<value>请先在Tun模式设置中设置sudo密码</value>
</data>
<data name="TbSettingsLinuxSudoPasswordNotSudoRunApp" xml:space="preserve">
<value>请不要用sudo运行本app</value>
<value>请不要用sudo运行本程序</value>
</data>
<data name="TransportHeaderTypeTip5" xml:space="preserve">
<value>*xhttp 模式</value>
@@ -1388,7 +1388,7 @@
<value>测试时自动分批的每批数量最大1000</value>
</data>
<data name="TbSettingsExceptionTip2" xml:space="preserve">
<value>例外. 对于下列地址不使用代理配置文件:使用逗号(,)分隔</value>
<value>例外对于下列地址不使用代理配置文件使用逗号(,)分隔</value>
</data>
<data name="TbSettingsDestOverride" xml:space="preserve">
<value>流量探测类型</value>

View File

@@ -136,7 +136,7 @@
<value>下載</value>
</data>
<data name="DownloadYesNo" xml:space="preserve">
<value>是否下載? {0}</value>
<value>是否下載{0}</value>
</data>
<data name="FailedConversionConfiguration" xml:space="preserve">
<value>轉換設定檔失敗</value>
@@ -154,7 +154,7 @@
<value>讀取設定檔失敗</value>
</data>
<data name="FillCorrectServerPort" xml:space="preserve">
<value>請填寫正確格式伺服器埠</value>
<value>請填寫正確格式伺服器埠</value>
</data>
<data name="FillLocalListeningPort" xml:space="preserve">
<value>請填寫本機偵聽埠</value>
@@ -169,16 +169,16 @@
<value>請填寫使用者ID</value>
</data>
<data name="Incorrectconfiguration" xml:space="preserve">
<value>不是正確的設定,請檢查</value>
<value>設定不正確,請檢查</value>
</data>
<data name="InitialConfiguration" xml:space="preserve">
<value>初始化設定</value>
</data>
<data name="IsLatestCore" xml:space="preserve">
<value>{0} {1} 已是最新版本</value>
<value>{0} {1} 已是最新版本</value>
</data>
<data name="IsLatestN" xml:space="preserve">
<value>{0} {1} 已是最新版本</value>
<value>{0} {1} 已是最新版本</value>
</data>
<data name="LvAddress" xml:space="preserve">
<value>位址</value>
@@ -226,7 +226,7 @@
<value>未設定有效的訂閱</value>
</data>
<data name="MsgParsingSuccessfully" xml:space="preserve">
<value>解析{0}成功</value>
<value>解析 {0} 成功</value>
</data>
<data name="MsgStartGettingSubscriptions" xml:space="preserve">
<value>開始獲取訂閱內容</value>
@@ -259,10 +259,10 @@
<value>在資料夾 ({0}) 下未找到Core檔案 (檔案名:{1}),請下載後放入資料夾,下載網址: {2}</value>
</data>
<data name="NoValidQRcodeFound" xml:space="preserve">
<value>掃描完成,未發現有效二維碼</value>
<value>掃描完成未發現有效二維碼</value>
</data>
<data name="OperationFailed" xml:space="preserve">
<value>操作失敗,請檢查重試</value>
<value>操作失敗,請檢查重試</value>
</data>
<data name="PleaseFillRemarks" xml:space="preserve">
<value>請填寫別名</value>
@@ -280,16 +280,17 @@
<value>伺服器去重完成。原數量: {0},現數量: {1}</value>
</data>
<data name="RemoveServer" xml:space="preserve">
<value>是否確定移除伺服器?</value>
<value>是否確定移除伺服器</value>
</data>
<data name="SaveClientConfigurationIn" xml:space="preserve">
<value>用戶端設定檔儲存在:{0}</value>
<value>用戶端設定檔儲存在{0}</value>
</data>
<data name="StartService" xml:space="preserve">
<value>啟動服務({0})...</value>
</data>
<data name="SuccessfulConfiguration" xml:space="preserve">
<value>設定成功{0}</value>
<value>設定成功
{0}</value>
</data>
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
<value>成功匯入自訂設定伺服器</value>
@@ -310,10 +311,10 @@
<value>請先選擇規則</value>
</data>
<data name="RemoveRules" xml:space="preserve">
<value>是否確定移除規則?</value>
<value>是否確定移除規則</value>
</data>
<data name="RoutingRuleDetailRequiredTips" xml:space="preserve">
<value>{0},必填其中一項.</value>
<value>{0}必填其中一項.</value>
</data>
<data name="LvRemarks" xml:space="preserve">
<value>別名</value>
@@ -328,10 +329,10 @@
<value>請填寫URL</value>
</data>
<data name="AddBatchRoutingRulesYesNo" xml:space="preserve">
<value>是否追加規則?選擇則追加,選擇否則取代</value>
<value>是否追加規則選擇“是”則追加選擇“否”則完全取代</value>
</data>
<data name="MsgDownloadGeoFileSuccessfully" xml:space="preserve">
<value>下載 GeoFile: {0} 成功</value>
<value>下載 GeoFile{0} 成功</value>
</data>
<data name="MsgInformationTitle" xml:space="preserve">
<value>資訊</value>
@@ -385,7 +386,7 @@
<value>*KCP seed</value>
</data>
<data name="RegisterGlobalHotkeyFailed" xml:space="preserve">
<value>註冊全域快速鍵 {0} 失敗,原因 {1}</value>
<value>註冊全域快速鍵 {0} 失敗原因{1}</value>
</data>
<data name="RegisterGlobalHotkeySuccessfully" xml:space="preserve">
<value>註冊全域快速鍵 {0} 成功</value>
@@ -484,10 +485,10 @@
<value>暗黑模式</value>
</data>
<data name="TbSettingsFollowSystemTheme" xml:space="preserve">
<value>是否跟隨系統主題</value>
<value>跟隨系統主題</value>
</data>
<data name="TbSettingsLanguage" xml:space="preserve">
<value>語言(重啟)</value>
<value>語言(重啟)</value>
</data>
<data name="menuAddServerViaClipboard" xml:space="preserve">
<value>從剪貼簿導入分享鏈接 (Ctrl+V)</value>
@@ -637,7 +638,7 @@
<value>傳輸層安全(TLS)</value>
</data>
<data name="TipNetwork" xml:space="preserve">
<value>*預設TCP,選錯會無法連接</value>
<value>*預設TCP選錯會無法連接</value>
</data>
<data name="TbCoreType" xml:space="preserve">
<value>Core類型</value>
@@ -670,7 +671,7 @@
<value>SOCKS埠</value>
</data>
<data name="TipPreSocksPort" xml:space="preserve">
<value>* 自訂設定的Socks埠值可不設定當設定此值後將使用Xray/sing-box(Tun)額外啟動一個前置Socks服務提供分流和速度顯示等功能</value>
<value>*自訂設定的Socks埠值可不設定當設定此值後將使用Xray/sing-box(Tun)額外啟動一個前置Socks服務提供分流和速度顯示等功能</value>
</data>
<!--********************************************-->
<data name="TbBrowse" xml:space="preserve">
@@ -680,7 +681,7 @@
<value>編輯</value>
</data>
<data name="TbSettingsAdvancedProtocol" xml:space="preserve">
<value>進階代理設定, 協定選擇(可選)</value>
<value>進階代理設定協定選擇(可選)</value>
</data>
<data name="TbSettingsAllowLAN" xml:space="preserve">
<value>允許來自區域網路的連線</value>
@@ -689,7 +690,7 @@
<value>啟動後隱藏視窗</value>
</data>
<data name="TbSettingsAutoUpdateInterval" xml:space="preserve">
<value>自動更新Geo檔案的間隔(單位小時)</value>
<value>自動更新Geo檔案的間隔(小時)</value>
</data>
<data name="TbSettingsCore" xml:space="preserve">
<value>Core: 基礎設定</value>
@@ -701,7 +702,7 @@
<value>Core: KCP設定</value>
</data>
<data name="TbSettingsCoreType" xml:space="preserve">
<value>Core類型設定</value>
<value>Core 類型設定</value>
</data>
<data name="TbSettingsDefAllowInsecure" xml:space="preserve">
<value>預設跳過憑證驗證(allowinsecure)</value>
@@ -719,7 +720,7 @@
<value>例外</value>
</data>
<data name="TbSettingsExceptionTip" xml:space="preserve">
<value>例外. 對於下列字元開頭的位址不使用代理設定檔:使用分號(;)分隔</value>
<value>例外對於下列字元開頭的位址不使用代理設定檔使用分號(;)分隔</value>
</data>
<data name="TbSettingsHttpPort" xml:space="preserve">
<value>本機HTTP偵聽埠</value>
@@ -746,7 +747,7 @@
<value>認證密碼</value>
</data>
<data name="TbSettingsRemoteDNS" xml:space="preserve">
<value>自訂DNS(可多個,用逗號(,)分隔)</value>
<value>自訂DNS(可多個用逗號(,)分隔)</value>
</data>
<data name="TbSettingsSetUWP" xml:space="preserve">
<value>解除Win10 UWP應用回環代理限制</value>
@@ -791,7 +792,7 @@
<value>全域快速鍵設定</value>
</data>
<data name="TbGlobalHotkeySettingTip" xml:space="preserve">
<value>直接按鍵盤進行設定, 重啟後生效</value>
<value>直接按鍵盤進行設定重啟後生效</value>
</data>
<data name="TbNotChangeSystemProxy" xml:space="preserve">
<value>不改變系統代理</value>
@@ -830,7 +831,7 @@
<value>上移 (U)</value>
</data>
<data name="MsgFilterTitle" xml:space="preserve">
<value>過濾, 支援正則</value>
<value>過濾(允許正則)</value>
</data>
<data name="menuWebsiteItem" xml:space="preserve">
<value>{0} 官網</value>
@@ -872,7 +873,7 @@
<value>預定義規則集列表</value>
</data>
<data name="TbRoutingTips" xml:space="preserve">
<value>*設定的路由規則,用逗號(,)分隔;正則中的逗號用&lt;COMMA&gt;替代</value>
<value>*設定的路由規則用逗號(,)分隔正則中的逗號用&lt;COMMA&gt;替代</value>
</data>
<data name="menuImportRulesFromClipboard" xml:space="preserve">
<value>從剪貼簿中匯入規則</value>
@@ -902,13 +903,13 @@
<value>路由規則詳情設定</value>
</data>
<data name="TbAutoSort" xml:space="preserve">
<value>儲存時Domain, IP, 行程名 自動排序</value>
<value>儲存時 Domain, IP, 行程名 自動排序</value>
</data>
<data name="TbRuleobjectDoc" xml:space="preserve">
<value>規則詳細說明檔案</value>
</data>
<data name="TbDnsObjectDoc" xml:space="preserve">
<value>支援填寫DnsObject,JSON格式點擊查看檔案</value>
<value>支援填寫DnsObjectJSON格式點擊查看説明</value>
</data>
<data name="SubUrlTips" xml:space="preserve">
<value>普通分組此處請留空</value>
@@ -920,7 +921,7 @@
<value>系統代理設定已改變</value>
</data>
<data name="TbSettingsRouteOnly" xml:space="preserve">
<value>RouteOnly</value>
<value>僅限路由(routeOnly)</value>
</data>
<data name="TbSettingsNotProxyLocalAddress" xml:space="preserve">
<value>請勿將代理伺服器用於本機Intranet位址</value>
@@ -935,7 +936,7 @@
<value>速度(M/s)</value>
</data>
<data name="FailedToRunCore" xml:space="preserve">
<value>執行Core失敗日誌</value>
<value>執行Core失敗查閲日誌</value>
</data>
<data name="LvFilter" xml:space="preserve">
<value>別名正則過濾</value>
@@ -947,13 +948,13 @@
<value>匯入舊的設定檔guiNConfig</value>
</data>
<data name="TbEnableTunAs" xml:space="preserve">
<value>啟用TUN</value>
<value>啟用Tun</value>
</data>
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
<value>為區域網路開啟新的埠</value>
</data>
<data name="TbSettingsTunMode" xml:space="preserve">
<value>TUN模式設定</value>
<value>Tun 模式設定</value>
</data>
<data name="menuMoveToGroup" xml:space="preserve">
<value>移至訂閱分組</value>
@@ -1067,7 +1068,7 @@
<value>sing-box Mux 多路復用協定</value>
</data>
<data name="TbRoutingRuleProcess" xml:space="preserve">
<value>行程名全稱 (TUN模式)</value>
<value>行程名全稱 (Tun模式)</value>
</data>
<data name="TbRoutingRuleDomain" xml:space="preserve">
<value>Domain</value>
@@ -1373,7 +1374,7 @@
<value>請先在Tun模式設定中設定sudo密碼</value>
</data>
<data name="TbSettingsLinuxSudoPasswordNotSudoRunApp" xml:space="preserve">
<value>請不要用sudo來運行本app</value>
<value>請不要用sudo來運行此App</value>
</data>
<data name="TransportHeaderTypeTip5" xml:space="preserve">
<value>*xhttp 模式</value>
@@ -1388,7 +1389,7 @@
<value>測試時自動分批的每批數量最大1000</value>
</data>
<data name="TbSettingsExceptionTip2" xml:space="preserve">
<value>例外. 對於下列位址不使用代理設定檔:使用逗號(,)分隔</value>
<value>例外對於下列位址不使用代理設定檔使用逗號(,)分隔</value>
</data>
<data name="TbSettingsDestOverride" xml:space="preserve">
<value>流量探測類型</value>

View File

@@ -5,24 +5,25 @@
"loglevel": "warning"
},
"inbounds": [],
"outbounds": [{
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "v2ray.cool",
"port": 10086,
"address": "",
"port": 0,
"users": [{
"id": "a3482e88-686a-4a58-8126-99c9df64b7bf",
"id": "",
"security": "auto"
}]
}],
"servers": [{
"address": "v2ray.cool",
"method": "chacha20",
"address": "",
"method": "",
"ota": false,
"password": "123456",
"port": 10086,
"password": "",
"port": 0,
"level": 1
}]
},
@@ -35,27 +36,23 @@
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block",
"settings": {
"response": {
"type": "http"
}
}
"tag": "block"
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"inboundTag": ["api"],
"outboundTag": "api",
"type": "field"
}
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
}
}

View File

@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>7.5.2</Version>
<Version>7.5.6</Version>
</PropertyGroup>
<ItemGroup>

View File

@@ -313,7 +313,7 @@ namespace ServiceLib.Services.CoreConfig
var outbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound);
await GenOutbound(item, outbound);
outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}";
singboxConfig.outbounds.Add(outbound);
singboxConfig.outbounds.Insert(0, outbound);
tagProxy.Add(outbound.tag);
}
if (tagProxy.Count <= 0)
@@ -333,7 +333,7 @@ namespace ServiceLib.Services.CoreConfig
outbounds = tagProxy,
interrupt_exist_connections = false,
};
singboxConfig.outbounds.Add(outUrltest);
singboxConfig.outbounds.Insert(0, outUrltest);
//add selector outbound
var outSelector = new Outbound4Sbox
@@ -344,7 +344,7 @@ namespace ServiceLib.Services.CoreConfig
interrupt_exist_connections = false,
};
outSelector.outbounds.Insert(0, outUrltest.tag);
singboxConfig.outbounds.Add(outSelector);
singboxConfig.outbounds.Insert(0, outSelector);
ret.Success = true;
ret.Data = JsonUtils.Serialize(singboxConfig);

View File

@@ -154,7 +154,7 @@ namespace ServiceLib.Services.CoreConfig
var outbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
await GenOutbound(item, outbound);
outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}";
v2rayConfig.outbounds.Add(outbound);
v2rayConfig.outbounds.Insert(0, outbound);
tagProxy.Add(outbound.tag);
}
if (tagProxy.Count <= 0)
@@ -182,15 +182,12 @@ namespace ServiceLib.Services.CoreConfig
rule.balancerTag = balancer.tag;
}
}
else
v2rayConfig.routing.rules.Add(new()
{
v2rayConfig.routing.rules.Add(new()
{
network = "tcp,udp",
balancerTag = balancer.tag,
type = "field"
});
}
network = "tcp,udp",
balancerTag = balancer.tag,
type = "field"
});
ret.Success = true;
ret.Data = JsonUtils.Serialize(v2rayConfig);
@@ -570,6 +567,7 @@ namespace ServiceLib.Services.CoreConfig
{
try
{
var muxEnabled = _config.CoreBasicItem.MuxEnabled;
switch (node.ConfigType)
{
case EConfigType.VMess:
@@ -610,7 +608,7 @@ namespace ServiceLib.Services.CoreConfig
usersItem.security = Global.DefaultSecurity;
}
await GenOutboundMux(node, outbound, _config.CoreBasicItem.MuxEnabled);
await GenOutboundMux(node, outbound, muxEnabled, muxEnabled);
outbound.settings.servers = null;
break;
@@ -635,7 +633,7 @@ namespace ServiceLib.Services.CoreConfig
serversItem.ota = false;
serversItem.level = 1;
await GenOutboundMux(node, outbound, false);
await GenOutboundMux(node, outbound);
outbound.settings.vnext = null;
break;
@@ -671,7 +669,7 @@ namespace ServiceLib.Services.CoreConfig
serversItem.users = new List<SocksUsersItem4Ray>() { socksUsersItem };
}
await GenOutboundMux(node, outbound, false);
await GenOutboundMux(node, outbound);
outbound.settings.vnext = null;
break;
@@ -705,22 +703,15 @@ namespace ServiceLib.Services.CoreConfig
usersItem.email = Global.UserEMail;
usersItem.encryption = node.Security;
await GenOutboundMux(node, outbound, _config.CoreBasicItem.MuxEnabled);
if (node.StreamSecurity == Global.StreamSecurityReality || node.StreamSecurity == Global.StreamSecurity)
if (node.Flow.IsNullOrEmpty())
{
if (Utils.IsNotEmpty(node.Flow))
{
usersItem.flow = node.Flow;
await GenOutboundMux(node, outbound, false);
}
await GenOutboundMux(node, outbound, muxEnabled, muxEnabled);
}
if (node.StreamSecurity == Global.StreamSecurityReality && Utils.IsNullOrEmpty(node.Flow))
else
{
await GenOutboundMux(node, outbound, _config.CoreBasicItem.MuxEnabled);
usersItem.flow = node.Flow;
await GenOutboundMux(node, outbound, false, muxEnabled);
}
outbound.settings.servers = null;
break;
}
@@ -743,7 +734,7 @@ namespace ServiceLib.Services.CoreConfig
serversItem.ota = false;
serversItem.level = 1;
await GenOutboundMux(node, outbound, false);
await GenOutboundMux(node, outbound);
outbound.settings.vnext = null;
break;
@@ -760,22 +751,24 @@ namespace ServiceLib.Services.CoreConfig
return 0;
}
private async Task<int> GenOutboundMux(ProfileItem node, Outbounds4Ray outbound, bool enabled)
private async Task<int> GenOutboundMux(ProfileItem node, Outbounds4Ray outbound, bool enabledTCP = false, bool enabledUDP = false)
{
try
{
if (enabled)
outbound.mux.enabled = false;
outbound.mux.concurrency = -1;
if (enabledTCP)
{
outbound.mux.enabled = true;
outbound.mux.concurrency = _config.Mux4RayItem.Concurrency;
}
else if (enabledUDP)
{
outbound.mux.enabled = true;
outbound.mux.xudpConcurrency = _config.Mux4RayItem.XudpConcurrency;
outbound.mux.xudpProxyUDP443 = _config.Mux4RayItem.XudpProxyUDP443;
}
else
{
outbound.mux.enabled = false;
outbound.mux.concurrency = -1;
}
}
catch (Exception ex)
{
@@ -931,7 +924,7 @@ namespace ServiceLib.Services.CoreConfig
}
streamSettings.xhttpSettings = xhttpSettings;
await GenOutboundMux(node, outbound, false);
await GenOutboundMux(node, outbound);
break;
//h2
@@ -1041,9 +1034,13 @@ namespace ServiceLib.Services.CoreConfig
//Outbound Freedom domainStrategy
if (Utils.IsNotEmpty(domainStrategy4Freedom))
{
var outbound = v2rayConfig.outbounds[1];
outbound.settings.domainStrategy = domainStrategy4Freedom;
outbound.settings.userLevel = 0;
var outbound = v2rayConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
if (outbound != null)
{
outbound.settings = new();
outbound.settings.domainStrategy = domainStrategy4Freedom;
outbound.settings.userLevel = 0;
}
}
var obj = JsonUtils.ParseJson(normalDNS);
@@ -1170,9 +1167,9 @@ namespace ServiceLib.Services.CoreConfig
{
fragment = new()
{
packets = "tlshello",
length = "100-200",
interval = "10-20"
packets = _config.Fragment4RayItem?.Packets,
length = _config.Fragment4RayItem?.Length,
interval = _config.Fragment4RayItem?.Interval
}
}
};

View File

@@ -13,6 +13,7 @@ namespace ServiceLib.Services
public event EventHandler<RetResult>? UpdateCompleted;
public event ErrorEventHandler? Error;
private static readonly string _tag = "DownloadService";
public async Task<int> DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action<bool, string> updateFunc)

View File

@@ -154,7 +154,7 @@ namespace ServiceLib.ViewModels
ProcUtils.ProcessStart(upgradeFileName, Global.RebootAs, Utils.StartupPath());
}
}
service?.Shutdown();
service?.Shutdown(true);
}
else
{

View File

@@ -303,7 +303,7 @@ namespace ServiceLib.ViewModels
{
if (!blWindowsShutDown)
{
_updateView?.Invoke(EViewAction.Shutdown, null);
_updateView?.Invoke(EViewAction.Shutdown, false);
}
}
}
@@ -329,9 +329,9 @@ namespace ServiceLib.ViewModels
_updateView?.Invoke(EViewAction.ShowHideWindow, blShow);
}
public void Shutdown()
public void Shutdown(bool byUser)
{
_updateView?.Invoke(EViewAction.Shutdown, null);
_updateView?.Invoke(EViewAction.Shutdown, byUser);
}
#endregion Actions

View File

@@ -3,12 +3,13 @@
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
xmlns:semi="https://irihi.tech/semi"
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
x:DataType="vms:StatusBarViewModel"
RequestedThemeVariant="Default">
<Application.Styles>
<semi:SemiTheme />
<StyleInclude Source="Assets/GlobalStyles.axaml" />
<StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" />
<StyleInclude Source="avares://Semi.Avalonia.DataGrid/Index.axaml" />
<StyleInclude Source="avares://DialogHost.Avalonia/Styles.xaml" />
</Application.Styles>

View File

@@ -71,12 +71,8 @@ public partial class App : Application
private async void MenuExit_Click(object? sender, EventArgs e)
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
var service = Locator.Current.GetService<MainWindowViewModel>();
if (service != null) await service.MyAppExitAsync(false);
desktop.Shutdown();
}
var service = Locator.Current.GetService<MainWindowViewModel>();
if (service != null) await service.MyAppExitAsync(true);
service?.Shutdown(true);
}
}

View File

@@ -31,6 +31,7 @@ namespace v2rayN.Desktop.ViewModels
{
ModifyTheme();
ModifyFontFamily();
ModifyFontSize();
}
private void BindingUI()
@@ -67,11 +68,10 @@ namespace v2rayN.Desktop.ViewModels
y => y > 0)
.Subscribe(c =>
{
if (CurrentFontSize >= Global.MinFontSize)
if (_config.UiItem.CurrentFontSize != CurrentFontSize && CurrentFontSize >= Global.MinFontSize)
{
_config.UiItem.CurrentFontSize = CurrentFontSize;
double size = CurrentFontSize;
ModifyFontSize(size);
ModifyFontSize();
ConfigHandler.SaveConfig(_config);
}
});
@@ -100,8 +100,11 @@ namespace v2rayN.Desktop.ViewModels
}
}
private void ModifyFontSize(double size)
private void ModifyFontSize()
{
double size = CurrentFontSize;
if (size < Global.MinFontSize) return;
Style style = new(x => Selectors.Or(
x.OfType<Button>(),
x.OfType<TextBox>(),

View File

@@ -223,6 +223,10 @@ namespace v2rayN.Desktop.Views
break;
case EViewAction.Shutdown:
if (obj != null && _blCloseByUser == false)
{
_blCloseByUser = (bool)obj;
}
StorageUI();
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{

View File

@@ -28,8 +28,8 @@
<PackageReference Include="Avalonia.ReactiveUI" Version="11.2.3" />
<PackageReference Include="DialogHost.Avalonia" Version="0.8.1" />
<PackageReference Include="MessageBox.Avalonia" Version="3.2.0" />
<PackageReference Include="Semi.Avalonia" Version="11.2.1.2" />
<PackageReference Include="Semi.Avalonia.DataGrid" Version="11.2.1.2" />
<PackageReference Include="Semi.Avalonia" Version="11.2.1.3" />
<PackageReference Include="Semi.Avalonia.DataGrid" Version="11.2.1.3" />
<PackageReference Include="ReactiveUI" Version="20.1.63" />
<PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
</ItemGroup>

View File

@@ -14,6 +14,7 @@ namespace v2rayN
internal static class WindowsUtils
{
private static readonly string _tag = "WindowsUtils";
/// <summary>
/// 获取剪贴板数
/// </summary>

View File

@@ -47,6 +47,7 @@ namespace v2rayN.ViewModels
private void RestoreUI()
{
ModifyTheme();
ModifyFontSize();
if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty())
{
var swatch = new SwatchesProvider().Swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName);
@@ -121,14 +122,10 @@ namespace v2rayN.ViewModels
y => y > 0)
.Subscribe(c =>
{
if (CurrentFontSize >= Global.MinFontSize)
if (_config.UiItem.CurrentFontSize != CurrentFontSize)
{
_config.UiItem.CurrentFontSize = CurrentFontSize;
double size = (long)CurrentFontSize;
Application.Current.Resources["StdFontSize"] = size;
Application.Current.Resources["StdFontSize1"] = size + 1;
Application.Current.Resources["StdFontSize-1"] = size - 1;
ModifyFontSize();
ConfigHandler.SaveConfig(_config);
}
});
@@ -158,6 +155,16 @@ namespace v2rayN.ViewModels
WindowsUtils.SetDarkBorder(Application.Current.MainWindow, isDarkTheme);
}
private void ModifyFontSize()
{
double size = (long)CurrentFontSize;
if (size < Global.MinFontSize) return;
Application.Current.Resources["StdFontSize"] = size;
Application.Current.Resources["StdFontSize1"] = size + 1;
Application.Current.Resources["StdFontSize-1"] = size - 1;
}
public void ChangePrimaryColor(System.Windows.Media.Color color)
{
var theme = _paletteHelper.GetTheme();

View File

@@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MaterialDesignThemes" Version="5.1.0" />
<PackageReference Include="MaterialDesignThemes" Version="5.2.0" />
<PackageReference Include="H.NotifyIcon.Wpf" Version="2.2.0" />
<PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
<PackageReference Include="ReactiveUI.WPF" Version="20.1.63" />