Compare commits

..

10 Commits

Author SHA1 Message Date
2dust
3f0bcf7b83 up 7.16.2 2025-11-14 19:46:54 +08:00
2dust
7e712fcdeb Refactor menu layouts in window views 2025-11-14 19:44:09 +08:00
2dust
e634e6dae3 Code clean 2025-11-13 20:31:02 +08:00
2dust
24f8d767b1 Update routing version prefix to V4 2025-11-12 19:34:04 +08:00
2dust
31a8ddef23 Update Directory.Packages.props 2025-11-12 19:33:32 +08:00
MkQtS
30e9e64fd5 Simplify sing-box rules for domain_suffix (#8306)
adapt to new domain_suffix behavior since sing-box 1.9.0
2025-11-12 19:08:57 +08:00
MkQtS
f677934257 Proxy all Google domains (#8287)
* Proxy all Google domains

Default geosite-cn(dat/srs) used by v2rayN contains google@cn, which performs poorly in certain user environments.

* Resolve all Google domains via remote server

* fix typo

* Add google to default geofiles
2025-11-12 19:08:36 +08:00
JieXu
df7ca81837 Update package-osx.sh (#8303) 2025-11-11 19:31:06 +08:00
tt2563
53bd03dea2 更新繁體中文翻譯 (#8302)
Co-authored-by: tes2511 <tes2511@user.user>
2025-11-11 19:30:41 +08:00
JieXu
1f8dd1a52d Update ResUI.fr.resx (#8297) 2025-11-10 19:59:29 +08:00
20 changed files with 104 additions and 140 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<Version>7.16.1</Version> <Version>7.16.2</Version>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>

View File

@@ -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" />

View File

@@ -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

View File

@@ -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;

View File

@@ -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 loption « 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, laction « 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>

View File

@@ -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>

View File

@@ -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",

View File

@@ -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",

View File

@@ -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"

View File

@@ -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"
] ]
}, },
{ {

View File

@@ -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"

View File

@@ -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:"))
{ {

View File

@@ -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);

View File

@@ -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>

View File

@@ -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}"

View File

@@ -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}"

View File

@@ -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"

View File

@@ -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 />