mirror of
https://github.com/2dust/v2rayN.git
synced 2026-02-28 13:13:04 +00:00
Compare commits
2 commits
1ae7c59e85
...
32fe4bf7b6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32fe4bf7b6 | ||
|
|
b4c386238c |
12 changed files with 386 additions and 606 deletions
|
|
@ -1,4 +1,4 @@
|
|||
namespace ServiceLib.Handler.Builder;
|
||||
namespace ServiceLib.Handler.Builder;
|
||||
|
||||
public record CoreConfigContextBuilderResult(CoreConfigContext Context, NodeValidatorResult ValidatorResult)
|
||||
{
|
||||
|
|
@ -7,18 +7,15 @@ public record CoreConfigContextBuilderResult(CoreConfigContext Context, NodeVali
|
|||
|
||||
public class CoreConfigContextBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// Builds a <see cref="CoreConfigContext"/> for the given node, resolves its proxy map,
|
||||
/// and processes outbound nodes referenced by routing rules.
|
||||
/// </summary>
|
||||
public static async Task<CoreConfigContextBuilderResult> Build(Config config, ProfileItem node)
|
||||
{
|
||||
var runCoreType = AppManager.Instance.GetCoreType(node, node.ConfigType);
|
||||
var coreType = runCoreType == ECoreType.sing_box ? ECoreType.sing_box : ECoreType.Xray;
|
||||
var coreType = AppManager.Instance.GetCoreType(node, node.ConfigType) == ECoreType.sing_box
|
||||
? ECoreType.sing_box
|
||||
: ECoreType.Xray;
|
||||
var context = new CoreConfigContext()
|
||||
{
|
||||
Node = node,
|
||||
RunCoreType = runCoreType,
|
||||
RunCoreType = AppManager.Instance.GetCoreType(node, node.ConfigType),
|
||||
AllProxiesMap = [],
|
||||
AppConfig = config,
|
||||
FullConfigTemplate = await AppManager.Instance.GetFullConfigTemplateItem(coreType),
|
||||
|
|
@ -31,7 +28,7 @@ public class CoreConfigContextBuilder
|
|||
RoutingItem = await ConfigHandler.GetDefaultRouting(config),
|
||||
};
|
||||
var validatorResult = NodeValidatorResult.Empty();
|
||||
var (actNode, nodeValidatorResult) = await ResolveNodeAsync(context, node);
|
||||
var (actNode, nodeValidatorResult) = await FillNodeContext(context, node);
|
||||
if (!nodeValidatorResult.Success)
|
||||
{
|
||||
return new CoreConfigContextBuilderResult(context, nodeValidatorResult);
|
||||
|
|
@ -43,27 +40,19 @@ public class CoreConfigContextBuilder
|
|||
var rules = JsonUtils.Deserialize<List<RulesItem>>(context.RoutingItem?.RuleSet);
|
||||
foreach (var ruleItem in rules.Where(ruleItem => !Global.OutboundTags.Contains(ruleItem.OutboundTag)))
|
||||
{
|
||||
if (ruleItem.OutboundTag.IsNullOrEmpty())
|
||||
{
|
||||
validatorResult.Warnings.Add(string.Format(ResUI.MsgRoutingRuleEmptyOutboundTag, ruleItem.Remarks));
|
||||
ruleItem.OutboundTag = Global.ProxyTag;
|
||||
continue;
|
||||
}
|
||||
var ruleOutboundNode = await AppManager.Instance.GetProfileItemViaRemarks(ruleItem.OutboundTag);
|
||||
if (ruleOutboundNode == null)
|
||||
{
|
||||
validatorResult.Warnings.Add(string.Format(ResUI.MsgRoutingRuleOutboundNodeNotFound, ruleItem.Remarks, ruleItem.OutboundTag));
|
||||
ruleItem.OutboundTag = Global.ProxyTag;
|
||||
continue;
|
||||
}
|
||||
|
||||
var (actRuleNode, ruleNodeValidatorResult) = await ResolveNodeAsync(context, ruleOutboundNode, false);
|
||||
var (actRuleNode, ruleNodeValidatorResult) = await FillNodeContext(context, ruleOutboundNode, false);
|
||||
validatorResult.Warnings.AddRange(ruleNodeValidatorResult.Warnings.Select(w =>
|
||||
string.Format(ResUI.MsgRoutingRuleOutboundNodeWarning, ruleItem.Remarks, ruleItem.OutboundTag, w)));
|
||||
$"Routing rule {ruleItem.Remarks} outbound node {ruleItem.OutboundTag} warning: {w}"));
|
||||
if (!ruleNodeValidatorResult.Success)
|
||||
{
|
||||
validatorResult.Warnings.AddRange(ruleNodeValidatorResult.Errors.Select(e =>
|
||||
string.Format(ResUI.MsgRoutingRuleOutboundNodeError, ruleItem.Remarks, ruleItem.OutboundTag, e)));
|
||||
$"Routing rule {ruleItem.Remarks} outbound node {ruleItem.OutboundTag} error: {e}. Fallback to proxy node only."));
|
||||
ruleItem.OutboundTag = Global.ProxyTag;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -75,11 +64,7 @@ public class CoreConfigContextBuilder
|
|||
return new CoreConfigContextBuilderResult(context, validatorResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolves a node into the context, optionally wrapping it in a subscription-level proxy chain.
|
||||
/// Returns the effective (possibly replaced) node and the validation result.
|
||||
/// </summary>
|
||||
public static async Task<(ProfileItem, NodeValidatorResult)> ResolveNodeAsync(CoreConfigContext context,
|
||||
public static async Task<(ProfileItem, NodeValidatorResult)> FillNodeContext(CoreConfigContext context,
|
||||
ProfileItem node,
|
||||
bool includeSubChain = true)
|
||||
{
|
||||
|
|
@ -90,71 +75,38 @@ public class CoreConfigContextBuilder
|
|||
|
||||
if (includeSubChain)
|
||||
{
|
||||
var (virtualChainNode, chainValidatorResult) = await BuildSubscriptionChainNodeAsync(node);
|
||||
var virtualChainNode = await BuildVirtualSubChainNode(node);
|
||||
if (virtualChainNode != null)
|
||||
{
|
||||
context.AllProxiesMap[virtualChainNode.IndexId] = virtualChainNode;
|
||||
var (resolvedNode, resolvedResult) = await ResolveNodeAsync(context, virtualChainNode, false);
|
||||
resolvedResult.Warnings.InsertRange(0, chainValidatorResult.Warnings);
|
||||
return (resolvedNode, resolvedResult);
|
||||
}
|
||||
// Chain not built but warnings may still exist (e.g. missing profiles)
|
||||
if (chainValidatorResult.Warnings.Count > 0)
|
||||
{
|
||||
var fillResult = await RegisterNodeAsync(context, node);
|
||||
fillResult.Warnings.InsertRange(0, chainValidatorResult.Warnings);
|
||||
return (node, fillResult);
|
||||
return await FillNodeContext(context, virtualChainNode, false);
|
||||
}
|
||||
}
|
||||
|
||||
var registerResult = await RegisterNodeAsync(context, node);
|
||||
return (node, registerResult);
|
||||
var fillResult = await FillNodeContextPrivate(context, node);
|
||||
return (node, fillResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If the node's subscription defines prev/next profiles, creates a virtual
|
||||
/// <see cref="EConfigType.ProxyChain"/> node that wraps them together.
|
||||
/// Returns <c>null</c> as the chain item when no chain is needed.
|
||||
/// Any warnings (e.g. missing prev/next profile) are returned in the validator result.
|
||||
/// </summary>
|
||||
private static async Task<(ProfileItem? ChainNode, NodeValidatorResult ValidatorResult)> BuildSubscriptionChainNodeAsync(ProfileItem node)
|
||||
private static async Task<ProfileItem?> BuildVirtualSubChainNode(ProfileItem node)
|
||||
{
|
||||
var result = NodeValidatorResult.Empty();
|
||||
|
||||
if (node.Subid.IsNullOrEmpty())
|
||||
{
|
||||
return (null, result);
|
||||
return null;
|
||||
}
|
||||
|
||||
var subItem = await AppManager.Instance.GetSubItem(node.Subid);
|
||||
if (subItem == null)
|
||||
if (subItem == null
|
||||
|| (subItem.PrevProfile.IsNullOrEmpty()
|
||||
&& subItem.NextProfile.IsNullOrEmpty()))
|
||||
{
|
||||
return (null, result);
|
||||
}
|
||||
|
||||
ProfileItem? prevNode = null;
|
||||
ProfileItem? nextNode = null;
|
||||
|
||||
if (!subItem.PrevProfile.IsNullOrEmpty())
|
||||
{
|
||||
prevNode = await AppManager.Instance.GetProfileItemViaRemarks(subItem.PrevProfile);
|
||||
if (prevNode == null)
|
||||
{
|
||||
result.Warnings.Add(string.Format(ResUI.MsgSubscriptionPrevProfileNotFound, subItem.PrevProfile));
|
||||
}
|
||||
}
|
||||
if (!subItem.NextProfile.IsNullOrEmpty())
|
||||
{
|
||||
nextNode = await AppManager.Instance.GetProfileItemViaRemarks(subItem.NextProfile);
|
||||
if (nextNode == null)
|
||||
{
|
||||
result.Warnings.Add(string.Format(ResUI.MsgSubscriptionNextProfileNotFound, subItem.NextProfile));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
var prevNode = await AppManager.Instance.GetProfileItemViaRemarks(subItem.PrevProfile);
|
||||
var nextNode = await AppManager.Instance.GetProfileItemViaRemarks(subItem.NextProfile);
|
||||
if (prevNode is null && nextNode is null)
|
||||
{
|
||||
return (null, result);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Build new proxy chain node
|
||||
|
|
@ -171,30 +123,22 @@ public class CoreConfigContextBuilder
|
|||
ChildItems = string.Join(",", childItems.Where(x => !x.IsNullOrEmpty())),
|
||||
};
|
||||
chainNode.SetProtocolExtra(chainExtraItem);
|
||||
return (chainNode, result);
|
||||
return chainNode;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dispatches registration to either <see cref="RegisterGroupNodeAsync"/> or
|
||||
/// <see cref="RegisterSingleNodeAsync"/> based on the node's config type.
|
||||
/// </summary>
|
||||
private static async Task<NodeValidatorResult> RegisterNodeAsync(CoreConfigContext context, ProfileItem node)
|
||||
private static async Task<NodeValidatorResult> FillNodeContextPrivate(CoreConfigContext context, ProfileItem node)
|
||||
{
|
||||
if (node.ConfigType.IsGroupType())
|
||||
{
|
||||
return await RegisterGroupNodeAsync(context, node);
|
||||
return await FillGroupNodeContextPrivate(context, node);
|
||||
}
|
||||
else
|
||||
{
|
||||
return RegisterSingleNodeAsync(context, node);
|
||||
return FillNormalNodeContextPrivate(context, node);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates a single (non-group) node and, on success, adds it to the proxy map
|
||||
/// and records any domain addresses that should bypass the proxy.
|
||||
/// </summary>
|
||||
private static NodeValidatorResult RegisterSingleNodeAsync(CoreConfigContext context, ProfileItem node)
|
||||
private static NodeValidatorResult FillNormalNodeContextPrivate(CoreConfigContext context, ProfileItem node)
|
||||
{
|
||||
if (node.ConfigType.IsGroupType())
|
||||
{
|
||||
|
|
@ -234,11 +178,7 @@ public class CoreConfigContextBuilder
|
|||
return nodeValidatorResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Entry point for registering a group node. Initialises the visited/ancestor sets
|
||||
/// and delegates to <see cref="TraverseGroupNodeAsync"/>.
|
||||
/// </summary>
|
||||
private static async Task<NodeValidatorResult> RegisterGroupNodeAsync(CoreConfigContext context,
|
||||
private static async Task<NodeValidatorResult> FillGroupNodeContextPrivate(CoreConfigContext context,
|
||||
ProfileItem node)
|
||||
{
|
||||
if (!node.ConfigType.IsGroupType())
|
||||
|
|
@ -246,17 +186,12 @@ public class CoreConfigContextBuilder
|
|||
return NodeValidatorResult.Empty();
|
||||
}
|
||||
|
||||
HashSet<string> ancestors = [node.IndexId];
|
||||
HashSet<string> globalVisited = [node.IndexId];
|
||||
return await TraverseGroupNodeAsync(context, node, globalVisited, ancestors);
|
||||
HashSet<string> ancestors = [];
|
||||
HashSet<string> globalVisited = [];
|
||||
return await FillGroupNodeContextPrivate(context, node, globalVisited, ancestors);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recursively walks the children of a group node, registering valid leaf nodes
|
||||
/// and nested groups. Detects cycles via <paramref name="ancestorsGroup"/> and
|
||||
/// deduplicates shared nodes via <paramref name="globalVisitedGroup"/>.
|
||||
/// </summary>
|
||||
private static async Task<NodeValidatorResult> TraverseGroupNodeAsync(
|
||||
private static async Task<NodeValidatorResult> FillGroupNodeContextPrivate(
|
||||
CoreConfigContext context,
|
||||
ProfileItem node,
|
||||
HashSet<string> globalVisitedGroup,
|
||||
|
|
@ -267,13 +202,6 @@ public class CoreConfigContextBuilder
|
|||
var childNodeValidatorResult = NodeValidatorResult.Empty();
|
||||
foreach (var childNode in groupChildList)
|
||||
{
|
||||
if (ancestorsGroup.Contains(childNode.IndexId))
|
||||
{
|
||||
childNodeValidatorResult.Errors.Add(
|
||||
string.Format(ResUI.MsgGroupCycleDependency, node.Remarks, childNode.Remarks));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (globalVisitedGroup.Contains(childNode.IndexId))
|
||||
{
|
||||
childIndexIdList.Add(childNode.IndexId);
|
||||
|
|
@ -282,40 +210,47 @@ public class CoreConfigContextBuilder
|
|||
|
||||
if (!childNode.ConfigType.IsGroupType())
|
||||
{
|
||||
var childNodeResult = RegisterSingleNodeAsync(context, childNode);
|
||||
var childNodeResult = FillNormalNodeContextPrivate(context, childNode);
|
||||
childNodeValidatorResult.Warnings.AddRange(childNodeResult.Warnings.Select(w =>
|
||||
string.Format(ResUI.MsgGroupChildNodeWarning, node.Remarks, childNode.Remarks, w)));
|
||||
$"Group {node.Remarks} child node {childNode.Remarks} warning: {w}"));
|
||||
childNodeValidatorResult.Errors.AddRange(childNodeResult.Errors.Select(e =>
|
||||
string.Format(ResUI.MsgGroupChildNodeError, node.Remarks, childNode.Remarks, e)));
|
||||
$"Group {node.Remarks} child node {childNode.Remarks} error: {e}. Skipping this node."));
|
||||
if (!childNodeResult.Success)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
globalVisitedGroup.Add(childNode.IndexId);
|
||||
childIndexIdList.Add(childNode.IndexId);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Detect cycle before recursive call
|
||||
if (DetectCycleFromGroup(childNode, globalVisitedGroup, ancestorsGroup))
|
||||
{
|
||||
childNodeValidatorResult.Errors.Add(
|
||||
$"Group {node.Remarks} has a cycle dependency on child node {childNode.Remarks}. Skipping this node.");
|
||||
continue;
|
||||
}
|
||||
|
||||
globalVisitedGroup.Add(childNode.IndexId);
|
||||
var newAncestorsGroup = new HashSet<string>(ancestorsGroup) { childNode.IndexId };
|
||||
var childGroupResult =
|
||||
await TraverseGroupNodeAsync(context, childNode, globalVisitedGroup, newAncestorsGroup);
|
||||
await FillGroupNodeContextPrivate(context, childNode, globalVisitedGroup, newAncestorsGroup);
|
||||
childNodeValidatorResult.Warnings.AddRange(childGroupResult.Warnings.Select(w =>
|
||||
string.Format(ResUI.MsgGroupChildGroupNodeWarning, node.Remarks, childNode.Remarks, w)));
|
||||
$"Group {node.Remarks} child group node {childNode.Remarks} warning: {w}"));
|
||||
childNodeValidatorResult.Errors.AddRange(childGroupResult.Errors.Select(e =>
|
||||
string.Format(ResUI.MsgGroupChildGroupNodeError, node.Remarks, childNode.Remarks, e)));
|
||||
$"Group {node.Remarks} child group node {childNode.Remarks} error: {e}. Skipping this node."));
|
||||
if (!childGroupResult.Success)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
globalVisitedGroup.Add(childNode.IndexId);
|
||||
childIndexIdList.Add(childNode.IndexId);
|
||||
}
|
||||
|
||||
if (childIndexIdList.Count == 0)
|
||||
{
|
||||
childNodeValidatorResult.Errors.Add(string.Format(ResUI.MsgGroupNoValidChildNode, node.Remarks));
|
||||
childNodeValidatorResult.Errors.Add($"Group {node.Remarks} has no valid child node.");
|
||||
return childNodeValidatorResult;
|
||||
}
|
||||
else
|
||||
|
|
@ -328,4 +263,22 @@ public class CoreConfigContextBuilder
|
|||
context.AllProxiesMap[node.IndexId] = node;
|
||||
return childNodeValidatorResult;
|
||||
}
|
||||
|
||||
private static bool DetectCycleFromGroup(
|
||||
ProfileItem item,
|
||||
HashSet<string> globalVisited,
|
||||
HashSet<string> ancestors)
|
||||
{
|
||||
if (!item.ConfigType.IsGroupType())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (globalVisited.Contains(item.IndexId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return ancestors.Contains(item.IndexId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
namespace ServiceLib.Handler.Builder;
|
||||
namespace ServiceLib.Handler.Builder;
|
||||
|
||||
public record NodeValidatorResult(List<string> Errors, List<string> Warnings)
|
||||
{
|
||||
|
|
@ -72,8 +72,8 @@ public class NodeValidator
|
|||
}
|
||||
|
||||
// Basic Property Validation
|
||||
v.Assert(!item.Address.IsNullOrEmpty(), string.Format(ResUI.MsgInvalidProperty, "Address"));
|
||||
v.Assert(item.Port is > 0 and <= 65535, string.Format(ResUI.MsgInvalidProperty, "Port"));
|
||||
v.Assert(!item.Address.IsNullOrEmpty(), string.Format(ResUI.InvalidProperty, "Address"));
|
||||
v.Assert(item.Port is > 0 and <= 65535, string.Format(ResUI.InvalidProperty, "Port"));
|
||||
|
||||
// Network & Core Logic
|
||||
var net = item.GetNetwork();
|
||||
|
|
@ -85,14 +85,14 @@ public class NodeValidator
|
|||
|
||||
if (!Global.SingboxSupportConfigType.Contains(item.ConfigType))
|
||||
{
|
||||
v.Error(string.Format(ResUI.MsgCoreNotSupportProtocol, nameof(ECoreType.sing_box), item.ConfigType));
|
||||
v.Error(string.Format(ResUI.CoreNotSupportProtocol, nameof(ECoreType.sing_box), item.ConfigType));
|
||||
}
|
||||
}
|
||||
else if (coreType is ECoreType.Xray)
|
||||
{
|
||||
if (!Global.XraySupportConfigType.Contains(item.ConfigType))
|
||||
{
|
||||
v.Error(string.Format(ResUI.MsgCoreNotSupportProtocol, nameof(ECoreType.Xray), item.ConfigType));
|
||||
v.Error(string.Format(ResUI.CoreNotSupportProtocol, nameof(ECoreType.Xray), item.ConfigType));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -102,30 +102,30 @@ public class NodeValidator
|
|||
{
|
||||
case EConfigType.VMess:
|
||||
v.Assert(!item.Password.IsNullOrEmpty() && Utils.IsGuidByParse(item.Password),
|
||||
string.Format(ResUI.MsgInvalidProperty, "Password"));
|
||||
string.Format(ResUI.InvalidProperty, "Password"));
|
||||
break;
|
||||
|
||||
case EConfigType.VLESS:
|
||||
// Example of converting a non-critical issue to Warning if desired
|
||||
if (item.Password.Length <= 30 && !Utils.IsGuidByParse(item.Password))
|
||||
{
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.MsgInvalidProperty, "Password"));
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.InvalidProperty, "Password"));
|
||||
}
|
||||
else
|
||||
{
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.MsgInvalidProperty, "Password"));
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.InvalidProperty, "Password"));
|
||||
}
|
||||
|
||||
v.Assert(Global.Flows.Contains(protocolExtra.Flow ?? string.Empty),
|
||||
string.Format(ResUI.MsgInvalidProperty, "Flow"));
|
||||
string.Format(ResUI.InvalidProperty, "Flow"));
|
||||
break;
|
||||
|
||||
case EConfigType.Shadowsocks:
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.MsgInvalidProperty, "Password"));
|
||||
v.Assert(!item.Password.IsNullOrEmpty(), string.Format(ResUI.InvalidProperty, "Password"));
|
||||
v.Assert(
|
||||
!string.IsNullOrEmpty(protocolExtra.SsMethod) &&
|
||||
Global.SsSecuritiesInSingbox.Contains(protocolExtra.SsMethod),
|
||||
string.Format(ResUI.MsgInvalidProperty, "SsMethod"));
|
||||
string.Format(ResUI.InvalidProperty, "SsMethod"));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -135,20 +135,20 @@ public class NodeValidator
|
|||
if (!item.Cert.IsNullOrEmpty() && CertPemManager.ParsePemChain(item.Cert).Count == 0 &&
|
||||
!item.CertSha.IsNullOrEmpty())
|
||||
{
|
||||
v.Error(string.Format(ResUI.MsgInvalidProperty, "TLS Certificate"));
|
||||
v.Error(string.Format(ResUI.InvalidProperty, "TLS Certificate"));
|
||||
}
|
||||
}
|
||||
|
||||
if (item.StreamSecurity == Global.StreamSecurityReality)
|
||||
{
|
||||
v.Assert(!item.PublicKey.IsNullOrEmpty(), string.Format(ResUI.MsgInvalidProperty, "PublicKey"));
|
||||
v.Assert(!item.PublicKey.IsNullOrEmpty(), string.Format(ResUI.InvalidProperty, "PublicKey"));
|
||||
}
|
||||
|
||||
if (item.Network == nameof(ETransport.xhttp) && !item.Extra.IsNullOrEmpty())
|
||||
{
|
||||
if (JsonUtils.ParseJson(item.Extra) is null)
|
||||
{
|
||||
v.Error(string.Format(ResUI.MsgInvalidProperty, "XHTTP Extra"));
|
||||
v.Error(string.Format(ResUI.InvalidProperty, "XHTTP Extra"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -158,20 +158,20 @@ public class NodeValidator
|
|||
// sing-box does not support xhttp / kcp transports
|
||||
if (SingboxUnsupportedTransports.Contains(net))
|
||||
{
|
||||
return string.Format(ResUI.MsgCoreNotSupportNetwork, nameof(ECoreType.sing_box), net);
|
||||
return string.Format(ResUI.CoreNotSupportNetwork, nameof(ECoreType.sing_box), net);
|
||||
}
|
||||
|
||||
// sing-box does not support non-tcp transports for protocols other than vmess/trojan/vless/shadowsocks
|
||||
if (!SingboxTransportSupportedProtocols.Contains(configType) && net != nameof(ETransport.tcp))
|
||||
{
|
||||
return string.Format(ResUI.MsgCoreNotSupportProtocolTransport,
|
||||
return string.Format(ResUI.CoreNotSupportProtocolTransport,
|
||||
nameof(ECoreType.sing_box), configType.ToString(), net);
|
||||
}
|
||||
|
||||
// sing-box shadowsocks only supports tcp/ws/quic transports
|
||||
if (configType == EConfigType.Shadowsocks && !SingboxShadowsocksAllowedTransports.Contains(net))
|
||||
{
|
||||
return string.Format(ResUI.MsgCoreNotSupportProtocolTransport,
|
||||
return string.Format(ResUI.CoreNotSupportProtocolTransport,
|
||||
nameof(ECoreType.sing_box), configType.ToString(), net);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ public static class CoreConfigHandler
|
|||
var nodes = await AppManager.Instance.GetProfileItemsByIndexIds(ids);
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
var (actNode, _) = await CoreConfigContextBuilder.ResolveNodeAsync(context, node, true);
|
||||
var (actNode, _) = await CoreConfigContextBuilder.FillNodeContext(context, node, true);
|
||||
if (node.IndexId == actNode.IndexId)
|
||||
{
|
||||
continue;
|
||||
|
|
|
|||
252
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
252
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
|
@ -132,6 +132,33 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support network type '{1}'. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string CoreNotSupportNetwork {
|
||||
get {
|
||||
return ResourceManager.GetString("CoreNotSupportNetwork", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support protocol '{1}'. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string CoreNotSupportProtocol {
|
||||
get {
|
||||
return ResourceManager.GetString("CoreNotSupportProtocol", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support protocol '{1}' when using transport '{2}'. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string CoreNotSupportProtocolTransport {
|
||||
get {
|
||||
return ResourceManager.GetString("CoreNotSupportProtocolTransport", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -285,6 +312,24 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group '{0}' is empty. Please add at least one node. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string GroupEmpty {
|
||||
get {
|
||||
return ResourceManager.GetString("GroupEmpty", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 {0} Group cannot reference itself or have a circular reference 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string GroupSelfReference {
|
||||
get {
|
||||
return ResourceManager.GetString("GroupSelfReference", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 This is not the correct configuration, please check 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -312,6 +357,15 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 The {0} property is invalid, please check. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string InvalidProperty {
|
||||
get {
|
||||
return ResourceManager.GetString("InvalidProperty", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Invalid address (URL) 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -1860,33 +1914,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support network type '{1}' 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgCoreNotSupportNetwork {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgCoreNotSupportNetwork", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support protocol '{1}' 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgCoreNotSupportProtocol {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgCoreNotSupportProtocol", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Core '{0}' does not support protocol '{1}' when using transport '{2}' 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgCoreNotSupportProtocolTransport {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgCoreNotSupportProtocolTransport", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Downloaded GeoFile: {0} successfully 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -1932,60 +1959,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} child group node {1} error: {2}. Skipping this node. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupChildGroupNodeError {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupChildGroupNodeError", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} child group node {1} warning: {2} 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupChildGroupNodeWarning {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupChildGroupNodeWarning", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} child node {1} error: {2}. Skipping this node. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupChildNodeError {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupChildNodeError", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} child node {1} warning: {2} 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupChildNodeWarning {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupChildNodeWarning", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} has a cycle dependency on child node {1}. Skipping this node. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupCycleDependency {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupCycleDependency", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Group {0} has no valid child node. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgGroupNoValidChildNode {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgGroupNoValidChildNode", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Information 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -1995,15 +1968,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 The {0} property is invalid, please check 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgInvalidProperty {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgInvalidProperty", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Please enter the URL 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2013,15 +1977,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Not support protocol '{0}' 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgNotSupportProtocol {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgNotSupportProtocol", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 No valid subscriptions set 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2040,42 +1995,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Routing rule {0} has an empty outbound tag. Fallback to proxy node only. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgRoutingRuleEmptyOutboundTag {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgRoutingRuleEmptyOutboundTag", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgRoutingRuleOutboundNodeError {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgRoutingRuleOutboundNodeError", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Routing rule {0} outbound node {1} not found. Fallback to proxy node only. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgRoutingRuleOutboundNodeNotFound {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgRoutingRuleOutboundNodeNotFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Routing rule {0} outbound node {1} warning: {2} 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgRoutingRuleOutboundNodeWarning {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgRoutingRuleOutboundNodeWarning", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Filter, press Enter to execute 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2130,24 +2049,6 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Subscription next proxy {0} not found. Skipping. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgSubscriptionNextProfileNotFound {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgSubscriptionNextProfileNotFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Subscription previous proxy {0} not found. Skipping. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string MsgSubscriptionPrevProfileNotFound {
|
||||
get {
|
||||
return ResourceManager.GetString("MsgSubscriptionPrevProfileNotFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Unpacking... 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2202,6 +2103,15 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Node alias '{0}' does not exist. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string NodeTagNotExist {
|
||||
get {
|
||||
return ResourceManager.GetString("NodeTagNotExist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Non-VMess or SS protocol 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2229,6 +2139,15 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Not support protocol '{0}'. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string NotSupportProtocol {
|
||||
get {
|
||||
return ResourceManager.GetString("NotSupportProtocol", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Scan completed, no valid QR code found 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2310,6 +2229,24 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Policy group: 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string PolicyGroupPrefix {
|
||||
get {
|
||||
return ResourceManager.GetString("PolicyGroupPrefix", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Proxy chained: 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string ProxyChainedPrefix {
|
||||
get {
|
||||
return ResourceManager.GetString("ProxyChainedPrefix", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Global hotkey {0} registration failed, reason: {1} 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
@ -2373,6 +2310,15 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Routing rule outbound: 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string RoutingRuleOutboundPrefix {
|
||||
get {
|
||||
return ResourceManager.GetString("RoutingRuleOutboundPrefix", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Run as Admin 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -1539,20 +1539,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>Multi-Configuration Fallback by Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>Proxy chained: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>Routing rule outbound: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>Policy group: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>Node alias '{0}' does not exist.</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>Group '{0}' is empty. Please add at least one node.</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check.</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} Group cannot reference itself or have a circular reference</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>If the system does not have a tray function, please do not enable it</value>
|
||||
|
|
@ -1650,40 +1668,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1536,20 +1536,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>Xray basculement (multi-sélection)</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le type de réseau « {1} »</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le type de réseau « {1} ».</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le protocole « {1} » avec le mode de transport « {2} »</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le protocole « {1} » avec le mode de transport « {2} ».</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le protocole « {1} »</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Le cœur « {0} » ne prend pas en charge le protocole « {1} ».</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>Chaîne de proxy : </value>
|
||||
</data>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>Règle de routage sortante : </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>Groupe de stratégie : </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>L’alias « {0} » n’existe pas.</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>Le groupe « {0} » est vide. Veuillez ajouter au moins une configuration.</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>La propriété {0} est invalide, veuillez vérifier</value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>Protocole « {0} » non pris en charge</value>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>Le groupe {0} ne peut pas se référencer lui-même ni créer de référence circulaire</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>Protocole « {0} » non pris en charge.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>Si le système n’a pas de zone de notif., n’activez pas cette option</value>
|
||||
|
|
@ -1647,40 +1665,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1539,20 +1539,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>Multi-Configuration Fallback by Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>Proxy chained: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>Routing rule outbound: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>Policy group: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>Node alias '{0}' does not exist.</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>Group '{0}' is empty. Please add at least one node.</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check.</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} Group cannot reference itself or have a circular reference</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>If the system does not have a tray function, please do not enable it</value>
|
||||
|
|
@ -1650,40 +1668,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1539,20 +1539,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>Fallback by Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>Proxy chained: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>Routing rule outbound: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>Policy group: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>Node alias '{0}' does not exist.</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>Group '{0}' is empty. Please add at least one node.</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check.</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} Group cannot reference itself or have a circular reference</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>If the system does not have a tray function, please do not enable it</value>
|
||||
|
|
@ -1650,40 +1668,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1539,20 +1539,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>Multi-Configuration Fallback by Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>Core '{0}' does not support network type '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}' when using transport '{2}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>Core '{0}' does not support protocol '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>Proxy chained: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>Routing rule outbound: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>Policy group: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>Node alias '{0}' does not exist.</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>Group '{0}' is empty. Please add at least one node.</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>The {0} property is invalid, please check.</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} Group cannot reference itself or have a circular reference</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>Not support protocol '{0}'.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>If the system does not have a tray function, please do not enable it</value>
|
||||
|
|
@ -1650,40 +1668,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1536,20 +1536,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>多选故障转移 Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支持网络类型 '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支持网络类型 '{1}'。</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>核心 '{0}' 在使用传输方式 '{2}' 时不支持协议 '{1}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>核心 '{0}' 在使用传输方式 '{2}' 时不支持协议 '{1}'。</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支持协议 '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支持协议 '{1}'。</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>{0} 属性无效,请检查</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>代理链: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>不支持协议 '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>路由规则出站: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>策略组: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>别名 '{0}' 不存在。</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>组“{0}”为空。请至少添加一个配置。</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>{0}属性无效,请检查</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} 分组不能引用自身或循环引用</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>不支持协议 '{0}'。</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>如果系统没有托盘功能,请不要开启</value>
|
||||
|
|
@ -1647,40 +1665,4 @@
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>路由规则 {0} 出站节点 {1} 警告:{2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>路由规则 {0} 出站节点 {1} 错误:{2}。已回退为仅使用代理节点。</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>节点组 {0} 与子节点 {1} 存在循环依赖,已跳过该节点。</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>节点组 {0} 子节点 {1} 警告:{2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>节点组 {0} 子节点 {1} 错误:{2}。已跳过该节点。</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>节点组 {0} 子节点组 {1} 警告:{2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>节点组 {0} 子节点组 {1} 错误:{2}。已跳过该节点。</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>节点组 {0} 下没有有效的子节点。</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>路由规则 {0} 的出站标签为空,已回退为仅使用代理节点。</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>路由规则 {0} 的出站节点 {1} 未找到,已回退为仅使用代理节点。</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>订阅前置节点 {0} 未找到,已跳过。</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>订阅后置节点 {0} 未找到,已跳过。</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1536,20 +1536,38 @@
|
|||
<data name="menuGenGroupMultipleServerXrayFallback" xml:space="preserve">
|
||||
<value>多選容錯移轉 Xray</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支援網路類型 '{1}'</value>
|
||||
<data name="CoreNotSupportNetwork" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支援網路類型 '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>核心 '{0}' 在使用傳輸方式 '{2}' 時不支援協定 '{1}'</value>
|
||||
<data name="CoreNotSupportProtocolTransport" xml:space="preserve">
|
||||
<value>核心 '{0}' 在使用傳輸方式 '{2}' 時不支援協定 '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgCoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支援協定 '{1}'</value>
|
||||
<data name="CoreNotSupportProtocol" xml:space="preserve">
|
||||
<value>核心 '{0}' 不支援協定 '{1}'.</value>
|
||||
</data>
|
||||
<data name="MsgInvalidProperty" xml:space="preserve">
|
||||
<value>{0} 屬性無效,請檢查</value>
|
||||
<data name="ProxyChainedPrefix" xml:space="preserve">
|
||||
<value>代理鏈: </value>
|
||||
</data>
|
||||
<data name="MsgNotSupportProtocol" xml:space="preserve">
|
||||
<value>不支援協定 '{0}'</value>
|
||||
<data name="RoutingRuleOutboundPrefix" xml:space="preserve">
|
||||
<value>路由規則出站: </value>
|
||||
</data>
|
||||
<data name="PolicyGroupPrefix" xml:space="preserve">
|
||||
<value>策略組: </value>
|
||||
</data>
|
||||
<data name="NodeTagNotExist" xml:space="preserve">
|
||||
<value>別名 '{0}' 不存在。</value>
|
||||
</data>
|
||||
<data name="GroupEmpty" xml:space="preserve">
|
||||
<value>組“{0}”為空.請至少添加一個配置。</value>
|
||||
</data>
|
||||
<data name="InvalidProperty" xml:space="preserve">
|
||||
<value>{0}屬性無效,請檢查</value>
|
||||
</data>
|
||||
<data name="GroupSelfReference" xml:space="preserve">
|
||||
<value>{0} 分組不能引用自身或循環引用</value>
|
||||
</data>
|
||||
<data name="NotSupportProtocol" xml:space="preserve">
|
||||
<value>不支援協定 '{0}'.</value>
|
||||
</data>
|
||||
<data name="TbSettingsHide2TrayWhenCloseTip" xml:space="preserve">
|
||||
<value>如果系統沒有託盤功能,請不要開啟</value>
|
||||
|
|
@ -1647,40 +1665,4 @@
|
|||
<data name="TbFinalmask" xml:space="preserve">
|
||||
<value>Finalmask</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeWarning" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} error: {2}. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Group {0} has a cycle dependency on child node {1}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Group {0} child node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} warning: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Group {0} child group node {1} error: {2}. Skipping this node.</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>Group {0} has no valid child node.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>Routing rule {0} has an empty outbound tag. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Routing rule {0} outbound node {1} not found. Fallback to proxy node only.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription previous proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Subscription next proxy {0} not found. Skipping.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -234,6 +234,13 @@ public class AddGroupServerViewModel : MyReactiveObject
|
|||
|
||||
SelectedSource.SetProtocolExtra(protocolExtra);
|
||||
|
||||
var hasCycle = await GroupProfileManager.HasCycle(SelectedSource.IndexId, protocolExtra);
|
||||
if (hasCycle)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(string.Format(ResUI.GroupSelfReference, remarks));
|
||||
return;
|
||||
}
|
||||
|
||||
if (await ConfigHandler.AddServerCommon(_config, SelectedSource) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
|
|
|
|||
Loading…
Reference in a new issue