Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f0bcf7b83 | ||
|
|
7e712fcdeb | ||
|
|
e634e6dae3 | ||
|
|
24f8d767b1 | ||
|
|
31a8ddef23 | ||
|
|
30e9e64fd5 | ||
|
|
f677934257 | ||
|
|
df7ca81837 | ||
|
|
53bd03dea2 | ||
|
|
1f8dd1a52d |
@@ -43,6 +43,8 @@ cat >"$PackagePath/v2rayN.app/Contents/Info.plist" <<-EOF
|
|||||||
<true/>
|
<true/>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>12.7</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -458,7 +458,7 @@ download_geo_assets() {
|
|||||||
"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geoip/$f" || true
|
"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geoip/$f" || true
|
||||||
done
|
done
|
||||||
for f in \
|
for f in \
|
||||||
geosite-cn.srs geosite-gfw.srs geosite-greatfire.srs \
|
geosite-cn.srs geosite-gfw.srs geosite-google.srs geosite-greatfire.srs \
|
||||||
geosite-geolocation-cn.srs geosite-category-ads-all.srs geosite-private.srs; do
|
geosite-geolocation-cn.srs geosite-category-ads-all.srs geosite-private.srs; do
|
||||||
curl -fsSL -o "$srss_dir/$f" \
|
curl -fsSL -o "$srss_dir/$f" \
|
||||||
"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geosite/$f" || true
|
"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geosite/$f" || true
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project>
|
<Project>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>7.16.1</Version>
|
<Version>7.16.2</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<PackageVersion Include="Semi.Avalonia" Version="11.3.7" />
|
<PackageVersion Include="Semi.Avalonia" Version="11.3.7" />
|
||||||
<PackageVersion Include="Semi.Avalonia.AvaloniaEdit" Version="11.2.0.1" />
|
<PackageVersion Include="Semi.Avalonia.AvaloniaEdit" Version="11.2.0.1" />
|
||||||
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.3.7" />
|
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.3.7" />
|
||||||
<PackageVersion Include="NLog" Version="6.0.5" />
|
<PackageVersion Include="NLog" Version="6.0.6" />
|
||||||
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||||
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
||||||
<PackageVersion Include="WebDav.Client" Version="2.9.0" />
|
<PackageVersion Include="WebDav.Client" Version="2.9.0" />
|
||||||
|
|||||||
@@ -2080,7 +2080,7 @@ public static class ConfigHandler
|
|||||||
/// <returns>0 if successful</returns>
|
/// <returns>0 if successful</returns>
|
||||||
public static async Task<int> InitBuiltinRouting(Config config, bool blImportAdvancedRules = false)
|
public static async Task<int> InitBuiltinRouting(Config config, bool blImportAdvancedRules = false)
|
||||||
{
|
{
|
||||||
var ver = "V3-";
|
var ver = "V4-";
|
||||||
var items = await AppManager.Instance.RoutingItems();
|
var items = await AppManager.Instance.RoutingItems();
|
||||||
|
|
||||||
//TODO Temporary code to be removed later
|
//TODO Temporary code to be removed later
|
||||||
@@ -2091,7 +2091,7 @@ public static class ConfigHandler
|
|||||||
items = await AppManager.Instance.RoutingItems();
|
items = await AppManager.Instance.RoutingItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!blImportAdvancedRules && items.Count > 0)
|
if (!blImportAdvancedRules && items.Count(u => u.Remarks.StartsWith(ver)) > 0)
|
||||||
{
|
{
|
||||||
//migrate
|
//migrate
|
||||||
//TODO Temporary code to be removed later
|
//TODO Temporary code to be removed later
|
||||||
|
|||||||
@@ -374,11 +374,15 @@ public class CertPemManager
|
|||||||
{
|
{
|
||||||
var beginIndex = pemChain.IndexOf(beginMarker, index, StringComparison.Ordinal);
|
var beginIndex = pemChain.IndexOf(beginMarker, index, StringComparison.Ordinal);
|
||||||
if (beginIndex == -1)
|
if (beginIndex == -1)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
var endIndex = pemChain.IndexOf(endMarker, beginIndex, StringComparison.Ordinal);
|
var endIndex = pemChain.IndexOf(endMarker, beginIndex, StringComparison.Ordinal);
|
||||||
if (endIndex == -1)
|
if (endIndex == -1)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Extract certificate content
|
// Extract certificate content
|
||||||
var base64Start = beginIndex + beginMarker.Length;
|
var base64Start = beginIndex + beginMarker.Length;
|
||||||
|
|||||||
@@ -1603,10 +1603,10 @@
|
|||||||
<value>Certificate Pinning</value>
|
<value>Certificate Pinning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbCertPinningTips" xml:space="preserve">
|
<data name="TbCertPinningTips" xml:space="preserve">
|
||||||
<value>Server Certificate (PEM format, optional)
|
<value>Certificat serveur (format PEM, facultatif)
|
||||||
When specified, the certificate will be pinned, and "Allow Insecure" will be disabled.
|
Si le certificat est défini, il est fixé et l’option « Ignorer la vérification » est désactivée.
|
||||||
|
|
||||||
The "Get Certificate" action may fail if a self-signed certificate is used or if the system contains an untrusted or malicious CA.</value>
|
Si un certificat auto-signé est utilisé ou si le système contient une CA non fiable ou malveillante, l’action « Obtenir le certificat » peut échouer.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbFetchCert" xml:space="preserve">
|
<data name="TbFetchCert" xml:space="preserve">
|
||||||
<value>Obtenir le certificat</value>
|
<value>Obtenir le certificat</value>
|
||||||
@@ -1630,6 +1630,6 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||||||
<value>Chemin script proxy système personnalisé</value>
|
<value>Chemin script proxy système personnalisé</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsMacOSShowInDock" xml:space="preserve">
|
<data name="TbSettingsMacOSShowInDock" xml:space="preserve">
|
||||||
<value>macOS displays this in the Dock (requires restart)</value>
|
<value>Afficher dans le Dock de macOS (redém. requis)</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1600,28 +1600,28 @@
|
|||||||
<value>自動從訂閱分組新增過濾後的配置</value>
|
<value>自動從訂閱分組新增過濾後的配置</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbCertPinning" xml:space="preserve">
|
<data name="TbCertPinning" xml:space="preserve">
|
||||||
<value>Certificate Pinning</value>
|
<value>憑證綁定</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbCertPinningTips" xml:space="preserve">
|
<data name="TbCertPinningTips" xml:space="preserve">
|
||||||
<value>Server Certificate (PEM format, optional)
|
<value>伺服器憑證(PEM 格式,可選)
|
||||||
When specified, the certificate will be pinned, and "Allow Insecure" will be disabled.
|
若已指定,憑證將會被綁定,並且「跳過憑證驗證」將被停用。
|
||||||
|
|
||||||
The "Get Certificate" action may fail if a self-signed certificate is used or if the system contains an untrusted or malicious CA.</value>
|
若使用自簽憑證,或系統中存在不受信任或惡意的 CA,「取得憑證」動作可能會失敗。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbFetchCert" xml:space="preserve">
|
<data name="TbFetchCert" xml:space="preserve">
|
||||||
<value>Fetch Certificate</value>
|
<value>獲取憑證</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbFetchCertChain" xml:space="preserve">
|
<data name="TbFetchCertChain" xml:space="preserve">
|
||||||
<value>Fetch Certificate Chain</value>
|
<value>獲取憑證鏈</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ServerNameMustBeValidDomain" xml:space="preserve">
|
<data name="ServerNameMustBeValidDomain" xml:space="preserve">
|
||||||
<value>Please set a valid domain</value>
|
<value>請設定有效的網域名稱</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CertNotSet" xml:space="preserve">
|
<data name="CertNotSet" xml:space="preserve">
|
||||||
<value>Certificate not set</value>
|
<value>尚未設定憑證</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CertSet" xml:space="preserve">
|
<data name="CertSet" xml:space="preserve">
|
||||||
<value>Certificate set</value>
|
<value>已設定憑證</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsCustomSystemProxyPacPath" xml:space="preserve">
|
<data name="TbSettingsCustomSystemProxyPacPath" xml:space="preserve">
|
||||||
<value>自訂 PAC 檔案路徑</value>
|
<value>自訂 PAC 檔案路徑</value>
|
||||||
|
|||||||
@@ -13,20 +13,19 @@
|
|||||||
"api.ip.sb"
|
"api.ip.sb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"remarks": "Google cn",
|
|
||||||
"outboundTag": "proxy",
|
|
||||||
"domain": [
|
|
||||||
"domain:googleapis.cn",
|
|
||||||
"domain:gstatic.com"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"remarks": "阻断udp443",
|
"remarks": "阻断udp443",
|
||||||
"outboundTag": "block",
|
"outboundTag": "block",
|
||||||
"port": "443",
|
"port": "443",
|
||||||
"network": "udp"
|
"network": "udp"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"remarks": "代理Google",
|
||||||
|
"outboundTag": "proxy",
|
||||||
|
"domain": [
|
||||||
|
"geosite:google"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"remarks": "绕过局域网IP",
|
"remarks": "绕过局域网IP",
|
||||||
"outboundTag": "direct",
|
"outboundTag": "direct",
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"remarks": "Google cn",
|
|
||||||
"outboundTag": "proxy",
|
|
||||||
"domain": [
|
|
||||||
"domain:googleapis.cn",
|
|
||||||
"domain:gstatic.com"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"remarks": "阻断udp443",
|
"remarks": "阻断udp443",
|
||||||
"outboundTag": "block",
|
"outboundTag": "block",
|
||||||
"port": "443",
|
"port": "443",
|
||||||
"network": "udp"
|
"network": "udp"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"remarks": "代理Google",
|
||||||
|
"outboundTag": "proxy",
|
||||||
|
"domain": [
|
||||||
|
"geosite:google"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"remarks": "绕过局域网IP",
|
"remarks": "绕过局域网IP",
|
||||||
"outboundTag": "direct",
|
"outboundTag": "direct",
|
||||||
|
|||||||
@@ -14,9 +14,8 @@
|
|||||||
],
|
],
|
||||||
"rules": [
|
"rules": [
|
||||||
{
|
{
|
||||||
"domain_suffix": [
|
"rule_set": [
|
||||||
"googleapis.cn",
|
"geosite-google"
|
||||||
"gstatic.com"
|
|
||||||
],
|
],
|
||||||
"server": "remote",
|
"server": "remote",
|
||||||
"strategy": "prefer_ipv4"
|
"strategy": "prefer_ipv4"
|
||||||
|
|||||||
@@ -8,8 +8,7 @@
|
|||||||
"address": "1.1.1.1",
|
"address": "1.1.1.1",
|
||||||
"skipFallback": true,
|
"skipFallback": true,
|
||||||
"domains": [
|
"domains": [
|
||||||
"domain:googleapis.cn",
|
"geosite:google"
|
||||||
"domain:gstatic.com"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,9 +14,8 @@
|
|||||||
],
|
],
|
||||||
"rules": [
|
"rules": [
|
||||||
{
|
{
|
||||||
"domain_suffix": [
|
"rule_set": [
|
||||||
"googleapis.cn",
|
"geosite-google"
|
||||||
"gstatic.com"
|
|
||||||
],
|
],
|
||||||
"server": "remote",
|
"server": "remote",
|
||||||
"strategy": "prefer_ipv4"
|
"strategy": "prefer_ipv4"
|
||||||
|
|||||||
@@ -316,10 +316,8 @@ public partial class CoreConfigSingboxService
|
|||||||
}
|
}
|
||||||
else if (domain.StartsWith("domain:"))
|
else if (domain.StartsWith("domain:"))
|
||||||
{
|
{
|
||||||
rule.domain ??= [];
|
|
||||||
rule.domain_suffix ??= [];
|
rule.domain_suffix ??= [];
|
||||||
rule.domain?.Add(domain.Substring(7));
|
rule.domain_suffix?.Add(domain.Substring(7));
|
||||||
rule.domain_suffix?.Add("." + domain.Substring(7));
|
|
||||||
}
|
}
|
||||||
else if (domain.StartsWith("full:"))
|
else if (domain.StartsWith("full:"))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,17 +17,17 @@ public class UpdateService(Config config, Func<bool, string, Task> updateFunc)
|
|||||||
{
|
{
|
||||||
if (args.Success)
|
if (args.Success)
|
||||||
{
|
{
|
||||||
UpdateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
_ = UpdateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
||||||
UpdateFunc(true, Utils.UrlEncode(fileName));
|
_ = UpdateFunc(true, Utils.UrlEncode(fileName));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.Msg);
|
_ = UpdateFunc(false, args.Msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
downloadHandle.Error += (sender2, args) =>
|
downloadHandle.Error += (sender2, args) =>
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.GetException().Message);
|
_ = UpdateFunc(false, args.GetException().Message);
|
||||||
};
|
};
|
||||||
|
|
||||||
await UpdateFunc(false, string.Format(ResUI.MsgStartUpdating, ECoreType.v2rayN));
|
await UpdateFunc(false, string.Format(ResUI.MsgStartUpdating, ECoreType.v2rayN));
|
||||||
@@ -57,26 +57,26 @@ public class UpdateService(Config config, Func<bool, string, Task> updateFunc)
|
|||||||
{
|
{
|
||||||
if (args.Success)
|
if (args.Success)
|
||||||
{
|
{
|
||||||
UpdateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
_ = UpdateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
||||||
UpdateFunc(false, ResUI.MsgUnpacking);
|
_ = UpdateFunc(false, ResUI.MsgUnpacking);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
UpdateFunc(true, fileName);
|
_ = UpdateFunc(true, fileName);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
UpdateFunc(false, ex.Message);
|
_ = UpdateFunc(false, ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.Msg);
|
_ = UpdateFunc(false, args.Msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
downloadHandle.Error += (sender2, args) =>
|
downloadHandle.Error += (sender2, args) =>
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.GetException().Message);
|
_ = UpdateFunc(false, args.GetException().Message);
|
||||||
};
|
};
|
||||||
|
|
||||||
await UpdateFunc(false, string.Format(ResUI.MsgStartUpdating, type));
|
await UpdateFunc(false, string.Format(ResUI.MsgStartUpdating, type));
|
||||||
@@ -396,6 +396,7 @@ public class UpdateService(Config config, Func<bool, string, Task> updateFunc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//append dns items TODO
|
//append dns items TODO
|
||||||
|
geoSiteFiles.Add("google");
|
||||||
geoSiteFiles.Add("cn");
|
geoSiteFiles.Add("cn");
|
||||||
geoSiteFiles.Add("geolocation-cn");
|
geoSiteFiles.Add("geolocation-cn");
|
||||||
geoSiteFiles.Add("category-ads-all");
|
geoSiteFiles.Add("category-ads-all");
|
||||||
@@ -438,7 +439,7 @@ public class UpdateService(Config config, Func<bool, string, Task> updateFunc)
|
|||||||
{
|
{
|
||||||
if (args.Success)
|
if (args.Success)
|
||||||
{
|
{
|
||||||
UpdateFunc(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, fileName));
|
_ = UpdateFunc(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, fileName));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -452,17 +453,17 @@ public class UpdateService(Config config, Func<bool, string, Task> updateFunc)
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
UpdateFunc(false, ex.Message);
|
_ = UpdateFunc(false, ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.Msg);
|
_ = UpdateFunc(false, args.Msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
downloadHandle.Error += (sender2, args) =>
|
downloadHandle.Error += (sender2, args) =>
|
||||||
{
|
{
|
||||||
UpdateFunc(false, args.GetException().Message);
|
_ = UpdateFunc(false, args.GetException().Message);
|
||||||
};
|
};
|
||||||
|
|
||||||
await downloadHandle.DownloadFileAsync(url, tmpFileName, true, _timeout);
|
await downloadHandle.DownloadFileAsync(url, tmpFileName, true, _timeout);
|
||||||
|
|||||||
@@ -24,13 +24,8 @@
|
|||||||
<DockPanel>
|
<DockPanel>
|
||||||
<DockPanel Margin="{StaticResource Margin8}" DockPanel.Dock="Top">
|
<DockPanel Margin="{StaticResource Margin8}" DockPanel.Dock="Top">
|
||||||
<ContentControl x:Name="conTheme" DockPanel.Dock="Right" />
|
<ContentControl x:Name="conTheme" DockPanel.Dock="Right" />
|
||||||
<Menu Margin="0,1">
|
<Menu Margin="{StaticResource Margin4}">
|
||||||
<MenuItem Padding="{StaticResource MarginLr8}">
|
<MenuItem Header="{x:Static resx:ResUI.menuServers}">
|
||||||
<MenuItem.Header>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock Text="{x:Static resx:ResUI.menuServers}" />
|
|
||||||
</StackPanel>
|
|
||||||
</MenuItem.Header>
|
|
||||||
<MenuItem x:Name="menuAddServerViaClipboard" Header="{x:Static resx:ResUI.menuAddServerViaClipboard}" />
|
<MenuItem x:Name="menuAddServerViaClipboard" Header="{x:Static resx:ResUI.menuAddServerViaClipboard}" />
|
||||||
<MenuItem x:Name="menuAddServerViaScan" Header="{x:Static resx:ResUI.menuAddServerViaScan}" />
|
<MenuItem x:Name="menuAddServerViaScan" Header="{x:Static resx:ResUI.menuAddServerViaScan}" />
|
||||||
<MenuItem x:Name="menuAddServerViaImage" Header="{x:Static resx:ResUI.menuAddServerViaImage}" />
|
<MenuItem x:Name="menuAddServerViaImage" Header="{x:Static resx:ResUI.menuAddServerViaImage}" />
|
||||||
@@ -51,12 +46,7 @@
|
|||||||
<MenuItem x:Name="menuAddAnytlsServer" Header="{x:Static resx:ResUI.menuAddAnytlsServer}" />
|
<MenuItem x:Name="menuAddAnytlsServer" Header="{x:Static resx:ResUI.menuAddAnytlsServer}" />
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
|
||||||
<MenuItem Padding="{StaticResource MarginLr8}">
|
<MenuItem Header="{x:Static resx:ResUI.menuSubscription}">
|
||||||
<MenuItem.Header>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock Text="{x:Static resx:ResUI.menuSubscription}" />
|
|
||||||
</StackPanel>
|
|
||||||
</MenuItem.Header>
|
|
||||||
<MenuItem x:Name="menuSubSetting" Header="{x:Static resx:ResUI.menuSubSetting}" />
|
<MenuItem x:Name="menuSubSetting" Header="{x:Static resx:ResUI.menuSubSetting}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem x:Name="menuSubUpdate" Header="{x:Static resx:ResUI.menuSubUpdate}" />
|
<MenuItem x:Name="menuSubUpdate" Header="{x:Static resx:ResUI.menuSubUpdate}" />
|
||||||
@@ -65,20 +55,24 @@
|
|||||||
<MenuItem x:Name="menuSubGroupUpdateViaProxy" Header="{x:Static resx:ResUI.menuSubGroupUpdateViaProxy}" />
|
<MenuItem x:Name="menuSubGroupUpdateViaProxy" Header="{x:Static resx:ResUI.menuSubGroupUpdateViaProxy}" />
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
|
||||||
<MenuItem Padding="{StaticResource MarginLr8}">
|
<MenuItem Header="{x:Static resx:ResUI.menuSetting}">
|
||||||
<MenuItem.Header>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock Text="{x:Static resx:ResUI.menuSetting}" />
|
|
||||||
</StackPanel>
|
|
||||||
</MenuItem.Header>
|
|
||||||
<MenuItem x:Name="menuOptionSetting" Header="{x:Static resx:ResUI.menuOptionSetting}" />
|
<MenuItem x:Name="menuOptionSetting" Header="{x:Static resx:ResUI.menuOptionSetting}" />
|
||||||
<MenuItem x:Name="menuRoutingSetting" Header="{x:Static resx:ResUI.menuRoutingSetting}" />
|
<MenuItem x:Name="menuRoutingSetting" Header="{x:Static resx:ResUI.menuRoutingSetting}" />
|
||||||
<MenuItem x:Name="menuDNSSetting" Header="{x:Static resx:ResUI.menuDNSSetting}" />
|
<MenuItem x:Name="menuDNSSetting" Header="{x:Static resx:ResUI.menuDNSSetting}" />
|
||||||
<MenuItem x:Name="menuFullConfigTemplate" Header="{x:Static resx:ResUI.menuFullConfigTemplate}" />
|
<MenuItem x:Name="menuFullConfigTemplate" Header="{x:Static resx:ResUI.menuFullConfigTemplate}" />
|
||||||
<MenuItem x:Name="menuGlobalHotkeySetting" Header="{x:Static resx:ResUI.menuGlobalHotkeySetting}" IsVisible="{Binding BlIsWindows}" />
|
<MenuItem
|
||||||
|
x:Name="menuGlobalHotkeySetting"
|
||||||
|
Header="{x:Static resx:ResUI.menuGlobalHotkeySetting}"
|
||||||
|
IsVisible="{Binding BlIsWindows}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem x:Name="menuRebootAsAdmin" Header="{x:Static resx:ResUI.menuRebootAsAdmin}" IsVisible="{Binding BlIsWindows}" />
|
<MenuItem
|
||||||
<MenuItem x:Name="menuSettingsSetUWP" Header="{x:Static resx:ResUI.TbSettingsSetUWP}" IsVisible="{Binding BlIsWindows}" />
|
x:Name="menuRebootAsAdmin"
|
||||||
|
Header="{x:Static resx:ResUI.menuRebootAsAdmin}"
|
||||||
|
IsVisible="{Binding BlIsWindows}" />
|
||||||
|
<MenuItem
|
||||||
|
x:Name="menuSettingsSetUWP"
|
||||||
|
Header="{x:Static resx:ResUI.TbSettingsSetUWP}"
|
||||||
|
IsVisible="{Binding BlIsWindows}" />
|
||||||
<MenuItem x:Name="menuClearServerStatistics" Header="{x:Static resx:ResUI.menuClearServerStatistics}" />
|
<MenuItem x:Name="menuClearServerStatistics" Header="{x:Static resx:ResUI.menuClearServerStatistics}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem Header="{x:Static resx:ResUI.menuRegionalPresets}">
|
<MenuItem Header="{x:Static resx:ResUI.menuRegionalPresets}">
|
||||||
@@ -90,15 +84,16 @@
|
|||||||
<MenuItem x:Name="menuOpenTheFileLocation" Header="{x:Static resx:ResUI.menuOpenTheFileLocation}" />
|
<MenuItem x:Name="menuOpenTheFileLocation" Header="{x:Static resx:ResUI.menuOpenTheFileLocation}" />
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
|
||||||
<MenuItem x:Name="menuReload" Padding="{StaticResource MarginLr8}" Header="{x:Static resx:ResUI.menuReload}" />
|
<MenuItem x:Name="menuReload" Header="{x:Static resx:ResUI.menuReload}" />
|
||||||
|
|
||||||
|
<MenuItem x:Name="menuHelp" Header="{x:Static resx:ResUI.menuHelp}">
|
||||||
<MenuItem x:Name="menuCheckUpdate" Header="{x:Static resx:ResUI.menuCheckUpdate}" />
|
<MenuItem x:Name="menuCheckUpdate" Header="{x:Static resx:ResUI.menuCheckUpdate}" />
|
||||||
|
<Separator />
|
||||||
|
</MenuItem>
|
||||||
|
|
||||||
<MenuItem x:Name="menuHelp" Padding="{StaticResource MarginLr8}" Header="{x:Static resx:ResUI.menuHelp}" />
|
<MenuItem x:Name="menuPromotion" Header="{x:Static resx:ResUI.menuPromotion}" />
|
||||||
|
|
||||||
<MenuItem x:Name="menuPromotion" Padding="{StaticResource MarginLr8}" Header="{x:Static resx:ResUI.menuPromotion}" />
|
<MenuItem x:Name="menuClose" Header="{x:Static resx:ResUI.menuExit}" />
|
||||||
|
|
||||||
<MenuItem x:Name="menuClose" Padding="{StaticResource MarginLr8}" Header="{x:Static resx:ResUI.menuExit}" />
|
|
||||||
</Menu>
|
</Menu>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
|
||||||
|
|||||||
@@ -14,17 +14,12 @@
|
|||||||
WindowStartupLocation="CenterScreen"
|
WindowStartupLocation="CenterScreen"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<DockPanel>
|
<DockPanel>
|
||||||
<StackPanel
|
<Menu Margin="{StaticResource Margin4}" DockPanel.Dock="Top">
|
||||||
Margin="{StaticResource Margin4}"
|
|
||||||
DockPanel.Dock="Top"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<Menu>
|
|
||||||
<MenuItem x:Name="menuRuleAdd" Header="{x:Static resx:ResUI.menuRuleAdd}" />
|
<MenuItem x:Name="menuRuleAdd" Header="{x:Static resx:ResUI.menuRuleAdd}" />
|
||||||
<MenuItem x:Name="menuImportRulesFromFile" Header="{x:Static resx:ResUI.menuImportRulesFromFile}" />
|
<MenuItem x:Name="menuImportRulesFromFile" Header="{x:Static resx:ResUI.menuImportRulesFromFile}" />
|
||||||
<MenuItem x:Name="menuImportRulesFromClipboard" Header="{x:Static resx:ResUI.menuImportRulesFromClipboard}" />
|
<MenuItem x:Name="menuImportRulesFromClipboard" Header="{x:Static resx:ResUI.menuImportRulesFromClipboard}" />
|
||||||
<MenuItem x:Name="menuImportRulesFromUrl" Header="{x:Static resx:ResUI.menuImportRulesFromUrl}" />
|
<MenuItem x:Name="menuImportRulesFromUrl" Header="{x:Static resx:ResUI.menuImportRulesFromUrl}" />
|
||||||
</Menu>
|
</Menu>
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
|||||||
@@ -15,16 +15,10 @@
|
|||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
|
||||||
<DockPanel>
|
<DockPanel>
|
||||||
<StackPanel
|
<Menu Margin="{StaticResource Margin4}" DockPanel.Dock="Top">
|
||||||
Margin="{StaticResource Margin4}"
|
|
||||||
DockPanel.Dock="Top"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
Spacing="4">
|
|
||||||
<Menu>
|
|
||||||
<MenuItem x:Name="menuRoutingAdvancedAdd2" Header="{x:Static resx:ResUI.menuRoutingAdvancedAdd}" />
|
<MenuItem x:Name="menuRoutingAdvancedAdd2" Header="{x:Static resx:ResUI.menuRoutingAdvancedAdd}" />
|
||||||
<MenuItem x:Name="menuRoutingAdvancedImportRules2" Header="{x:Static resx:ResUI.menuRoutingAdvancedImportRules}" />
|
<MenuItem x:Name="menuRoutingAdvancedImportRules2" Header="{x:Static resx:ResUI.menuRoutingAdvancedImportRules}" />
|
||||||
</Menu>
|
</Menu>
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
|||||||
@@ -20,18 +20,13 @@
|
|||||||
DisableOpeningAnimation="True"
|
DisableOpeningAnimation="True"
|
||||||
Identifier="dialogHostSub">
|
Identifier="dialogHostSub">
|
||||||
<DockPanel Margin="{StaticResource Margin8}">
|
<DockPanel Margin="{StaticResource Margin8}">
|
||||||
<StackPanel
|
<Menu Margin="{StaticResource Margin4}" DockPanel.Dock="Top">
|
||||||
Margin="{StaticResource Margin4}"
|
|
||||||
DockPanel.Dock="Top"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<Menu>
|
|
||||||
<MenuItem x:Name="menuSubAdd" Header="{x:Static resx:ResUI.menuSubAdd}" />
|
<MenuItem x:Name="menuSubAdd" Header="{x:Static resx:ResUI.menuSubAdd}" />
|
||||||
<MenuItem x:Name="menuSubDelete" Header="{x:Static resx:ResUI.menuSubDelete}" />
|
<MenuItem x:Name="menuSubDelete" Header="{x:Static resx:ResUI.menuSubDelete}" />
|
||||||
<MenuItem x:Name="menuSubEdit" Header="{x:Static resx:ResUI.menuSubEdit}" />
|
<MenuItem x:Name="menuSubEdit" Header="{x:Static resx:ResUI.menuSubEdit}" />
|
||||||
<MenuItem x:Name="menuSubShare" Header="{x:Static resx:ResUI.menuSubShare}" />
|
<MenuItem x:Name="menuSubShare" Header="{x:Static resx:ResUI.menuSubShare}" />
|
||||||
<MenuItem x:Name="menuClose" Header="{x:Static resx:ResUI.menuClose}" />
|
<MenuItem x:Name="menuClose" Header="{x:Static resx:ResUI.menuClose}" />
|
||||||
</Menu>
|
</Menu>
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<DataGrid
|
<DataGrid
|
||||||
x:Name="lstSubscription"
|
x:Name="lstSubscription"
|
||||||
|
|||||||
@@ -246,23 +246,6 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
|
||||||
<MenuItem
|
|
||||||
Name="menuCheckUpdate"
|
|
||||||
Padding="{StaticResource MarginLeftRight8}"
|
|
||||||
AutomationProperties.Name="{x:Static resx:ResUI.menuCheckUpdate}">
|
|
||||||
<MenuItem.Header>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<materialDesign:PackIcon
|
|
||||||
Margin="{StaticResource MarginRight8}"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Kind="Update" />
|
|
||||||
<TextBlock Text="{x:Static resx:ResUI.menuCheckUpdate}" />
|
|
||||||
</StackPanel>
|
|
||||||
</MenuItem.Header>
|
|
||||||
</MenuItem>
|
|
||||||
</Menu>
|
|
||||||
<Separator />
|
|
||||||
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
<Menu Margin="0,1" Style="{StaticResource ToolbarMenu}">
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuHelp"
|
x:Name="menuHelp"
|
||||||
@@ -277,6 +260,8 @@
|
|||||||
<TextBlock Text="{x:Static resx:ResUI.menuHelp}" />
|
<TextBlock Text="{x:Static resx:ResUI.menuHelp}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</MenuItem.Header>
|
</MenuItem.Header>
|
||||||
|
<MenuItem x:Name="menuCheckUpdate" Header="{x:Static resx:ResUI.menuCheckUpdate}" />
|
||||||
|
<Separator Margin="-40,5" />
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Separator />
|
<Separator />
|
||||||
|
|||||||
Reference in New Issue
Block a user