From 66c672f429932ffe661923e7fd75f354526ffd0e Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 12:58:59 +0100 Subject: [PATCH 01/21] Fix null deref in FileNameValidator and BooleansOrConverter. Use GeneratedRegex. Signed-off-by: Manuel Ullmann --- Source/NETworkManager.Converters/BooleansOrConverter.cs | 2 +- Source/NETworkManager.Validators/FileNameValidator.cs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/NETworkManager.Converters/BooleansOrConverter.cs b/Source/NETworkManager.Converters/BooleansOrConverter.cs index 5f4af3b2b5..1c78fee710 100644 --- a/Source/NETworkManager.Converters/BooleansOrConverter.cs +++ b/Source/NETworkManager.Converters/BooleansOrConverter.cs @@ -9,7 +9,7 @@ public sealed class BooleansOrConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { - return values.Any(value => (bool)value); + return values?.OfType().Any(value => value) ?? false; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) diff --git a/Source/NETworkManager.Validators/FileNameValidator.cs b/Source/NETworkManager.Validators/FileNameValidator.cs index 7defc70b48..7c44c747b3 100644 --- a/Source/NETworkManager.Validators/FileNameValidator.cs +++ b/Source/NETworkManager.Validators/FileNameValidator.cs @@ -10,7 +10,7 @@ namespace NETworkManager.Validators; /// Check if the filename is a valid file name (like "text.txt"). The file name does not have to exist on the local /// system. /// -public class FileNameValidator : ValidationRule +public partial class FileNameValidator : ValidationRule { /// /// Check if the filename is a valid file name (like "text.txt"). The filen ame does not have to exist on the local @@ -24,8 +24,11 @@ public override ValidationResult Validate(object value, CultureInfo cultureInfo) var filename = (string)value; // Check if the filename has valid chars and a dot. - return filename.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && new Regex(@"^.+\..+$").IsMatch(filename) + return (filename?.IndexOfAny(Path.GetInvalidFileNameChars()) ?? 1) < 0 && FileRegex().IsMatch(filename) ? ValidationResult.ValidResult : new ValidationResult(false, Strings.EnterValidFileName); } + + [GeneratedRegex(@"^.+\..+$")] + private static partial Regex FileRegex(); } \ No newline at end of file From fcddf1bc80396ed4c13b850dfb747d4952acc6cd Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 12:59:45 +0100 Subject: [PATCH 02/21] BindingProxy: Docs and use nameof. Signed-off-by: Manuel Ullmann --- .../BindingProxy.cs | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Source/NETworkManager.Utilities.WPF/BindingProxy.cs b/Source/NETworkManager.Utilities.WPF/BindingProxy.cs index 8906a9febf..e18aacf4b4 100644 --- a/Source/NETworkManager.Utilities.WPF/BindingProxy.cs +++ b/Source/NETworkManager.Utilities.WPF/BindingProxy.cs @@ -2,17 +2,38 @@ namespace NETworkManager.Utilities.WPF; +/// +/// Provides a binding proxy class for enabling bindings to data contexts that are not directly +/// accessible within a XAML element's logical or visual tree. +/// +/// +/// This class inherits from and uses a dependency property to hold the +/// data context. It is particularly useful in scenarios where bindings are required in data templates +/// or styles, and the desired data context is otherwise inaccessible. +/// public class BindingProxy : Freezable { + /// + /// Dependency property used to hold a generic object. + /// This property allows data binding scenarios where a proxy + /// is required to transfer data between binding contexts. + /// public static readonly DependencyProperty DataProperty = - DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy)); + DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy)); + /// + /// Gets or sets the data object used for binding in WPF applications. + /// public object Data { get => GetValue(DataProperty); set => SetValue(DataProperty, value); } + /// Creates a new instance of the BindingProxy class. + /// + /// A new instance of the BindingProxy class. + /// protected override Freezable CreateInstanceCore() { return new BindingProxy(); From 4525d29f68e12fc392f09128cae43b3e0bc56300 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:00:37 +0100 Subject: [PATCH 03/21] Add and set ValidationErrorTemplate for CheckBoxes. Signed-off-by: Manuel Ullmann --- .../Resources/Styles/CheckBoxStyles.xaml | 1 + .../Templates/ValidationErrorTemplates.xaml | 98 ++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/Source/NETworkManager/Resources/Styles/CheckBoxStyles.xaml b/Source/NETworkManager/Resources/Styles/CheckBoxStyles.xaml index 3291de6f49..ddb56a9e10 100644 --- a/Source/NETworkManager/Resources/Styles/CheckBoxStyles.xaml +++ b/Source/NETworkManager/Resources/Styles/CheckBoxStyles.xaml @@ -5,6 +5,7 @@ + + + + + + + + + + + + + + + + + + + + + From d6fdd8f8b484f3be978d03c2a1971fb93c47e225 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:01:17 +0100 Subject: [PATCH 04/21] Fix obvious typo in ChildWindowStyles restricting the window height to 500. Signed-off-by: Manuel Ullmann --- Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml b/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml index 0840efad21..4fe8957b03 100644 --- a/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml +++ b/Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml @@ -11,6 +11,6 @@ - + From 39a6c6a1399a688c6fd18011e3ebab9676ac34d1 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:02:06 +0100 Subject: [PATCH 05/21] Reuse FileExistsValidator in EmptyOrFileExistsValidator. Signed-off-by: Manuel Ullmann --- .../EmptyOrFileExistsValidator.cs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs b/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs index d669e71e4d..e24ce4ffb9 100644 --- a/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs +++ b/Source/NETworkManager.Validators/EmptyOrFileExistsValidator.cs @@ -1,19 +1,22 @@ using System.Globalization; -using System.IO; using System.Windows.Controls; -using NETworkManager.Localization.Resources; namespace NETworkManager.Validators; public class EmptyOrFileExistsValidator : ValidationRule { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) + private static FileExistsValidator FileExistsValidator { - if (string.IsNullOrEmpty(value as string)) - return ValidationResult.ValidResult; + get + { + field ??= new FileExistsValidator(); + return field; + } + } - return File.Exists((string)value) - ? ValidationResult.ValidResult - : new ValidationResult(false, Strings.FileDoesNotExist); + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + return string.IsNullOrEmpty(value as string) + ? ValidationResult.ValidResult : FileExistsValidator.Validate(value, cultureInfo); } } \ No newline at end of file From c9e73e5739dce5248260238b4b505be54ee4f846 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:03:21 +0100 Subject: [PATCH 06/21] ListHelper: code documentation and refactoring of Modify as generic. Remove duplicates. Signed-off-by: Manuel Ullmann --- Source/NETworkManager.Utilities/ListHelper.cs | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/Source/NETworkManager.Utilities/ListHelper.cs b/Source/NETworkManager.Utilities/ListHelper.cs index 190a0203db..0069591e98 100644 --- a/Source/NETworkManager.Utilities/ListHelper.cs +++ b/Source/NETworkManager.Utilities/ListHelper.cs @@ -1,30 +1,33 @@ using System.Collections.Generic; namespace NETworkManager.Utilities; - +/// +/// Helps to modify a list to implement history combo boxes. +/// public static class ListHelper { - public static List Modify(List list, string entry, int length) - { - var index = list.IndexOf(entry); - - if (index != -1) - list.RemoveAt(index); - else if (list.Count == length) - list.RemoveAt(length - 1); - - list.Insert(0, entry); - - return list; - } - - public static List Modify(List list, int entry, int length) + /// + /// Modify a list by adding the and removing the oldest entry if the list is full. + /// If an entry or multiple ones already exist in the list, they will be removed before adding the new entry. + /// + /// List to modify. Used with to add and remove entries. + /// Entry to add to the list. + /// Maximum length of the list. Oldest entries will be removed if the list exceeds this length. + /// Type of the list entries. Currently or . + /// Modified list with the new entry added and oldest entries removed if necessary. + public static List Modify(List list, T entry, int length) { - var index = list.IndexOf(entry); - - if (index != -1) + int index; + bool removedEntry = false; + do + { + index = list.IndexOf(entry); + if (index is -1) + break; list.RemoveAt(index); - else if (list.Count == length) + removedEntry = true; + } while (index >= 0); + if (!removedEntry && list.Count == length) list.RemoveAt(length - 1); list.Insert(0, entry); From f58adf92495d616b2642ee89204c2a1170d58e7d Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:04:58 +0100 Subject: [PATCH 07/21] PowershellHelper: Support commands exceeding the command line limit of Int16.MaxValue by creating temporary scripts when necessary. Signed-off-by: Manuel Ullmann --- .../PowerShellHelper.cs | 72 ++++++++++++++----- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/Source/NETworkManager.Utilities/PowerShellHelper.cs b/Source/NETworkManager.Utilities/PowerShellHelper.cs index e608693e88..a1f81e54ea 100644 --- a/Source/NETworkManager.Utilities/PowerShellHelper.cs +++ b/Source/NETworkManager.Utilities/PowerShellHelper.cs @@ -1,37 +1,77 @@ -using System.Diagnostics; +using System; +using System.ComponentModel; +using System.IO; +using System.Diagnostics; namespace NETworkManager.Utilities; public static class PowerShellHelper { /// - /// Execute a PowerShell command. + /// Execute a PowerShell command. Writes a temporary script file if the command is longer than Windows limits. /// /// Command to execute. /// - /// Start PowerShell as administrator. Error code 1223 is returned when UAC dialog is canceled by - /// user. + /// Start PowerShell as an administrator. Error code 1223 is returned when the UAC dialog is canceled by + /// the user. /// /// Window style of the PowerShell console (Default: Hidden) public static void ExecuteCommand(string command, bool asAdmin = false, ProcessWindowStyle windowStyle = ProcessWindowStyle.Hidden) { - var info = new ProcessStartInfo + string scriptPath = string.Empty; + string powershell = "powershell.exe"; + string baseOpts = "-NoProfile -NoLogo"; + string commandOpts = $" -Command {command}"; + // Handle Windows command line length limit of 32 767 characters + if (powershell.Length + + baseOpts.Length + + commandOpts.Length > 32767) { - FileName = "powershell.exe", - Arguments = $"-NoProfile -NoLogo -Command {command}", - UseShellExecute = true, - WindowStyle = windowStyle - }; + var tempDir = Path.GetTempPath(); + scriptPath = Path.Combine(tempDir, $"NwM_{Guid.NewGuid()}_Temp.ps1"); + File.WriteAllText(scriptPath, command); + commandOpts = $" -ExecutionPolicy Bypass -File \"{scriptPath}\""; + } - if (asAdmin) - info.Verb = "runas"; + try + { + var info = new ProcessStartInfo() + { + FileName = powershell, + Arguments = $"{baseOpts} {commandOpts}", + UseShellExecute = true, + WindowStyle = windowStyle + }; - using var process = new Process(); + if (asAdmin) + info.Verb = "runas"; - process.StartInfo = info; + using var process = new Process(); + process.StartInfo = info; + process.Start(); + process.WaitForExit(); + } + catch (Win32Exception e) when (asAdmin) + { + if (e.NativeErrorCode != 1223) + throw; + // Nothing to handle on UAC cancellation + } + finally + { + if (scriptPath != string.Empty) + { + try + { + File.Delete(scriptPath); + } + catch + { + // ignored + } + } + } - process.Start(); - process.WaitForExit(); } } \ No newline at end of file From 9023d2d37ad4e28d08fe75c1811760afe69c63e6 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:05:41 +0100 Subject: [PATCH 08/21] NetworkInterfaceView: Fix all warnings. Signed-off-by: Manuel Ullmann --- .../Views/NetworkInterfaceView.xaml | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Source/NETworkManager/Views/NetworkInterfaceView.xaml b/Source/NETworkManager/Views/NetworkInterfaceView.xaml index a3d3f13e93..821aa65256 100644 --- a/Source/NETworkManager/Views/NetworkInterfaceView.xaml +++ b/Source/NETworkManager/Views/NetworkInterfaceView.xaml @@ -37,7 +37,6 @@ x:Key="IPAddressSubnetmaskTupleArrayToStringConverter" /> - @@ -104,7 +103,7 @@ + Foreground="{StaticResource MahApps.Brushes.Gray3}" /> @@ -729,7 +728,7 @@ + Foreground="{StaticResource MahApps.Brushes.Gray3}" /> @@ -838,7 +837,7 @@ @@ -968,7 +967,7 @@ + Foreground="{StaticResource MahApps.Brushes.Gray3}" /> @@ -1050,10 +1049,13 @@ + Style="{DynamicResource DefaultTextBlock}" Margin="0,10,0,0"> + + + + + Foreground="{StaticResource MahApps.Brushes.Gray2}" /> @@ -1255,7 +1257,7 @@ - @@ -1470,7 +1472,7 @@ - @@ -1495,7 +1497,7 @@ + Visibility="{Binding Path=ProfileFilterTagsView.IsEmpty, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"> @@ -1514,7 +1516,7 @@ - + From 42530bd08be25b9244a810743b752623771d989c Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:07:11 +0100 Subject: [PATCH 09/21] ProfileChildWindow: Remove size limit for wider content. Signed-off-by: Manuel Ullmann --- Source/NETworkManager/Views/ProfileChildWindow.xaml.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs b/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs index aa19c9d22f..d5b59dd028 100644 --- a/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs +++ b/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs @@ -16,8 +16,6 @@ public ProfileChildWindow(Window parentWindow) InitializeComponent(); // Set the width and height of the child window based on the parent window size - ChildWindowMaxWidth = 1050; - ChildWindowMaxHeight = 650; ChildWindowWidth = parentWindow.ActualWidth * 0.85; ChildWindowHeight = parentWindow.ActualHeight * 0.85; From 5e2411cd77647ba733bcf0db0ca4863f1f4bd8de Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:36:47 +0100 Subject: [PATCH 10/21] Add NetworkProfile enum and a property for later use in NetworkInterface. Signed-off-by: Manuel Ullmann --- .../Network/NetworkInterfaceInfo.cs | 5 ++++ .../Network/NetworkProfiles.cs | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 Source/NETworkManager.Models/Network/NetworkProfiles.cs diff --git a/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs b/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs index 81b782e7e9..020461f3dd 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterfaceInfo.cs @@ -118,4 +118,9 @@ public class NetworkInterfaceInfo /// DNS server(s). /// public IPAddress[] DNSServer { get; set; } + + /// + /// Firewall network category (Private, Public, Domain) + /// + public NetworkProfiles Profiles { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkProfiles.cs b/Source/NETworkManager.Models/Network/NetworkProfiles.cs new file mode 100644 index 0000000000..32258c3c1c --- /dev/null +++ b/Source/NETworkManager.Models/Network/NetworkProfiles.cs @@ -0,0 +1,27 @@ +namespace NETworkManager.Models.Network; + +/// +/// Defines the network profile detected by Windows. +/// +public enum NetworkProfiles +{ + /// + /// Network profile is not configured. + /// + NotConfigured = -1, + + /// + /// Network has an Active Directory (AD) controller and you are authenticated. + /// + Domain, + + /// + /// Network is private. Firewall will allow most connections. + /// + Private, + + /// + /// Network is public. Firewall will block most connections. + /// + Public +} \ No newline at end of file From 34e7047f1e7eab0836afd195015b921d3b87e91e Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:51:56 +0100 Subject: [PATCH 11/21] Add NETworkManager.Interfaces project to avoid certain circular references and for typed binding proxies. Signed-off-by: Manuel Ullmann --- .../NETworkManager.Interfaces.csproj | 14 ++++++++ .../FrameworkElementProxy.cs | 35 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 Source/NETworkManager.Interfaces/NETworkManager.Interfaces.csproj create mode 100644 Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FrameworkElementProxy.cs diff --git a/Source/NETworkManager.Interfaces/NETworkManager.Interfaces.csproj b/Source/NETworkManager.Interfaces/NETworkManager.Interfaces.csproj new file mode 100644 index 0000000000..422d2aaa6d --- /dev/null +++ b/Source/NETworkManager.Interfaces/NETworkManager.Interfaces.csproj @@ -0,0 +1,14 @@ + + + + net10.0-windows10.0.22621.0 + enable + enable + NETworkManager.Interfaces + + + + + + + diff --git a/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FrameworkElementProxy.cs b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FrameworkElementProxy.cs new file mode 100644 index 0000000000..b238bc8acc --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FrameworkElementProxy.cs @@ -0,0 +1,35 @@ +using System.Windows; + +namespace NETworkManager.Utilities.WPF.TypedBindingProxies; + +/// +/// Binding proxy for s. +/// +public class FrameworkElementProxy : Freezable +{ + /// + /// Dependency property used to hold a generic object. + /// This property allows data binding scenarios where a proxy + /// is required to transfer data between binding contexts. + /// + public static readonly DependencyProperty DataProperty = + DependencyProperty.Register(nameof(Data), typeof(FrameworkElement), typeof(FrameworkElementProxy)); + + /// + /// Gets or sets the data object used for binding in WPF applications. + /// + public FrameworkElement Data + { + get => (FrameworkElement)GetValue(DataProperty); + set => SetValue(DataProperty, value); + } + + /// Creates a new instance of the BindingProxy class. + /// + /// A new instance of the BindingProxy class. + /// + protected override Freezable CreateInstanceCore() + { + return new BindingProxy(); + } +} \ No newline at end of file From 80a33d0ba3667fd5f943e12b87ce8da48e96d89a Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:54:21 +0100 Subject: [PATCH 12/21] Add generic converter for DataGrid column collapsing, checking properties passed as parameter for null, empty strings or empty enumerables. Signed-off-by: Manuel Ullmann --- .../CollectionPropertyBooleanOrConverter.cs | 63 +++++++++++++ .../CollectionPropertyVisibilityConverter.cs | 90 +++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 Source/NETworkManager.Converters/CollectionPropertyBooleanOrConverter.cs create mode 100644 Source/NETworkManager.Converters/CollectionPropertyVisibilityConverter.cs diff --git a/Source/NETworkManager.Converters/CollectionPropertyBooleanOrConverter.cs b/Source/NETworkManager.Converters/CollectionPropertyBooleanOrConverter.cs new file mode 100644 index 0000000000..5d4f39e667 --- /dev/null +++ b/Source/NETworkManager.Converters/CollectionPropertyBooleanOrConverter.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; +using System.Windows.Data; +using NETworkManager.Interfaces.ViewModels; + +namespace NETworkManager.Converters +{ + /// + /// A generic converter that checks a property of items in a collection. + /// If ANY item's property is considered "present" (not null, not empty), it returns Visible. + /// + /// The type of item in the collection. + public class CollectionPropertyBooleanOrConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + // 1. Validate inputs + if (value is not IEnumerable collection) + return false; + + if (parameter is not string propertyName || string.IsNullOrEmpty(propertyName)) + return false; + + // 2. Get PropertyInfo via Reflection or cache. + if (!Cache.TryGetValue(propertyName, out var propertyInfo)) + { + propertyInfo = typeof(T).GetProperty(propertyName); + Cache.TryAdd(propertyName, propertyInfo); + } + + if (propertyInfo == null) + return false; + + // 3. Iterate collection and check property + foreach (var item in collection) + { + if (item == null) continue; + + var propValue = propertyInfo.GetValue(item); + + if (propValue is true) + return true; + } + + return false; + } + + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + private ConcurrentDictionary Cache { get; } = new(); + } + + // Concrete implementation for XAML usage + public class FirewallRuleViewModelBooleanOrConverter : CollectionPropertyBooleanOrConverter; +} + diff --git a/Source/NETworkManager.Converters/CollectionPropertyVisibilityConverter.cs b/Source/NETworkManager.Converters/CollectionPropertyVisibilityConverter.cs new file mode 100644 index 0000000000..10cd08f848 --- /dev/null +++ b/Source/NETworkManager.Converters/CollectionPropertyVisibilityConverter.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; +using System.Windows; +using System.Windows.Data; +using NETworkManager.Interfaces.ViewModels; + +namespace NETworkManager.Converters +{ + /// + /// A generic converter that checks a property of items in a collection. + /// If ANY item's property is considered "present" (not null, not empty), it returns Visible. + /// + /// The type of item in the collection. + public class CollectionPropertyVisibilityConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + // 1. Validate inputs + if (value is not IEnumerable collection) + return Visibility.Collapsed; + + if (parameter is not string propertyName || string.IsNullOrEmpty(propertyName)) + return Visibility.Collapsed; + + // 2. Get PropertyInfo via Reflection or cache. + if (!Cache.TryGetValue(propertyName, out var propertyInfo)) + { + propertyInfo = typeof(T).GetProperty(propertyName); + Cache.TryAdd(propertyName, propertyInfo); + } + + if (propertyInfo == null) + return Visibility.Collapsed; + + // 3. Iterate collection and check property + foreach (var item in collection) + { + if (item == null) continue; + + var propValue = propertyInfo.GetValue(item); + + if (HasContent(propValue)) + { + return Visibility.Visible; + } + } + + return Visibility.Collapsed; + } + + private static bool HasContent(object value) + { + if (value == null) return false; + + // Handle Strings + if (value is string str) + return !string.IsNullOrWhiteSpace(str); + + // Handle Collections (Lists, Arrays, etc.) + if (value is ICollection col) + return col.Count > 0; + + // Handle Generic Enumerable (fallback) + if (value is IEnumerable enumValue) + { + var enumerator = enumValue.GetEnumerator(); + var result = enumerator.MoveNext(); // Has at least one item + (enumerator as IDisposable)?.Dispose(); + return result; + } + + // Default: If it's an object and not null, it's "True" + return true; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + private ConcurrentDictionary Cache { get; } = new(); + } + + // Concrete implementation for XAML usage + public class FirewallRuleViewModelVisibilityConverter : CollectionPropertyVisibilityConverter; +} From 53ea91190b0ffa1a30b7deb25e6c316ea4a6fd03 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:55:22 +0100 Subject: [PATCH 13/21] Add converter to use size factors in XAML. Signed-off-by: Manuel Ullmann --- .../SizeFactorConverter.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Source/NETworkManager.Converters/SizeFactorConverter.cs diff --git a/Source/NETworkManager.Converters/SizeFactorConverter.cs b/Source/NETworkManager.Converters/SizeFactorConverter.cs new file mode 100644 index 0000000000..e2a23b1e5a --- /dev/null +++ b/Source/NETworkManager.Converters/SizeFactorConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; +/// +/// Multiplies a value by a factor given with the parameter. +/// +/// +/// Useful for setting sizes relative to window size. +/// +public class SizeFactorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + double theValue = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); + double factor = System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture); + return theValue * factor; + } + catch (Exception e) when (e is FormatException or InvalidCastException or OverflowException) + { + return 0.0; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file From 90645958c91706ee285a18f907f294929cf109ac Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:56:17 +0100 Subject: [PATCH 14/21] Add ValidationHelper to convert ViewModel HasError states to style changes. Signed-off-by: Manuel Ullmann --- .../ValidationHelper.cs | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Source/NETworkManager.Utilities.WPF/ValidationHelper.cs diff --git a/Source/NETworkManager.Utilities.WPF/ValidationHelper.cs b/Source/NETworkManager.Utilities.WPF/ValidationHelper.cs new file mode 100644 index 0000000000..ce243a1449 --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/ValidationHelper.cs @@ -0,0 +1,68 @@ +using System; +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; + +namespace NETworkManager.Utilities.WPF; + +/// +/// This allows propagating validation errors to a ViewModel allowing style changes bound +/// to the view, e.g., red border on a DataGridRow. +/// +/// +/// Class is AI-generated. See FirewallRuleGrid control for usage. +/// +public static class ValidationHelper +{ + // This property acts as a bridge. We can write to it from a Style Trigger, + // and it can push that value to the ViewModel via OneWayToSource binding. + public static readonly DependencyProperty HasErrorProperty = DependencyProperty.RegisterAttached( + "HasError", + typeof(bool), + typeof(ValidationHelper), + new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); + + public static void SetHasError(DependencyObject element, bool value) => element.SetValue(HasErrorProperty, value); + + public static bool GetHasError(DependencyObject element) => (bool)element.GetValue(HasErrorProperty); + + // Observe validation errors directly. Required unless NotifyOnValidationErrors is set. + public static readonly DependencyProperty ObserveValidationProperty = DependencyProperty.RegisterAttached( + "ObserveValidation", + typeof(bool), + typeof(ValidationHelper), + new PropertyMetadata(false, OnObserveValidationChanged)); + + public static void SetObserveValidation(DependencyObject element, bool value) => element.SetValue(ObserveValidationProperty, value); + + public static bool GetObserveValidation(DependencyObject element) => (bool)element.GetValue(ObserveValidationProperty); + + private static void OnObserveValidationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not FrameworkElement element) + return; + + if ((bool)e.NewValue) + { + // Listen to the Validation.HasError property changes directly + var descriptor = DependencyPropertyDescriptor.FromProperty(Validation.HasErrorProperty, typeof(FrameworkElement)); + descriptor.AddValueChanged(element, OnValidationHasErrorChanged); + + // Initial sync + SetHasError(element, Validation.GetHasError(element)); + } + else + { + var descriptor = DependencyPropertyDescriptor.FromProperty(Validation.HasErrorProperty, typeof(FrameworkElement)); + descriptor.RemoveValueChanged(element, OnValidationHasErrorChanged); + } + } + + private static void OnValidationHasErrorChanged(object sender, EventArgs e) + { + if (sender is DependencyObject d) + { + SetHasError(d, Validation.GetHasError(d)); + } + } +} \ No newline at end of file From 99fe27b5f865a8673bb3bcb2d0b9aa2a6a365118 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 13:57:46 +0100 Subject: [PATCH 15/21] Add converters for localized enum conversion (int, string). Signed-off-by: Manuel Ullmann --- .../EnumToIntConverter.cs | 61 +++++++++++++ .../EnumToStringConverter.cs | 86 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 Source/NETworkManager.Converters/EnumToIntConverter.cs create mode 100644 Source/NETworkManager.Converters/EnumToStringConverter.cs diff --git a/Source/NETworkManager.Converters/EnumToIntConverter.cs b/Source/NETworkManager.Converters/EnumToIntConverter.cs new file mode 100644 index 0000000000..1dbaa4e5dc --- /dev/null +++ b/Source/NETworkManager.Converters/EnumToIntConverter.cs @@ -0,0 +1,61 @@ +using System; +using System.Globalization; +using System.Windows.Data; + + +namespace NETworkManager.Converters; + +/// +/// A value converter that facilitates the conversion between enumeration values and their corresponding integer indices or string names. +/// +/// +/// This converter is designed to either: +/// - Convert an enumeration value to its integer index within the enumeration. +/// - Convert an enumeration value to its string representation. +/// When converting back, the same logic is applied to handle appropriate conversion. +/// +public class EnumToIntConverter : IValueConverter +{ + /// + /// Converts an Enum value to its corresponding integer index or string representation + /// based on the target type. If the target type is an Enum, the method attempts + /// to return the name of the enum value. If the provided value is an Enum, it + /// returns the integer index of the value within the Enum's definition. + /// + /// The value to convert. This can be an Enum instance or null. + /// The target type for the conversion. Typically either Enum or int. + /// An optional parameter for additional input, not used in this method. + /// The culture information for the conversion process. + /// + /// If the targetType is an Enum, a string representation of the Enum name is returned. + /// If the value is an Enum, the integer index of the Enum value is returned. + /// If neither condition is met, null is returned. + /// + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType.IsEnum) + { + return value is null ? string.Empty : + Enum.GetName(targetType, value); + } + if (value is Enum enumVal) + { + return Array.IndexOf(Enum.GetValues(enumVal.GetType()), enumVal); + } + + return null; + } + + /// Converts a value back into its corresponding enumeration value or integer representation. + /// This method is typically used in two-way data bindings where an integer or string needs + /// to be converted back to the corresponding enum value. + /// The value to be converted back. This can be an integer or a string representation of an enumeration value. + /// The type of the target object, typically the type of the enumeration. + /// An optional parameter for the conversion. Not used in this implementation. + /// The culture information to use during the conversion process. + /// The enumeration value corresponding to the input value. + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/EnumToStringConverter.cs b/Source/NETworkManager.Converters/EnumToStringConverter.cs new file mode 100644 index 0000000000..68347bb79a --- /dev/null +++ b/Source/NETworkManager.Converters/EnumToStringConverter.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Globalization; +using System.Resources; +using System.Windows.Data; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Converters; + +/// +/// A converter used to transform an value into its corresponding string, +/// using localization resources for string mapping. Also provides functionality to convert +/// localized or raw string values back to the corresponding value. +/// +/// +/// This class is not guaranteed to be thread-safe. It should be used only in the context of the application’s +/// UI thread or with proper synchronization for shared use cases. +/// +/// +public sealed class EnumToStringConverter : IValueConverter +{ + /// Converts an enumeration value to its localized string representation and vice versa. + /// + /// The value to convert. This can be an enumeration value or a string. + /// + /// + /// The expected type of the target binding, typically the type of the enumeration being converted. + /// + /// + /// An optional parameter to use in the conversion process, if applicable. + /// + /// + /// The culture information to use during the conversion, affecting localization. + /// + /// + /// A string representing the localized name of the enumeration, or the enumeration corresponding + /// to the given string. If the conversion fails, a fallback enumeration value or string is returned. + /// + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not Enum enumValue) + { + string fallback = Enum.ToObject(targetType, 255) as string; + if (value is not string strVal) + return fallback; + fallback = strVal; + ResourceSet resourceSet = Strings.ResourceManager.GetResourceSet(Strings.Culture, + false, true); + string foundKey = null; + if (resourceSet is null) + return fallback; + foreach (DictionaryEntry item in resourceSet) + { + if (item.Value as string != strVal && item.Key as string != strVal) + continue; + foundKey = item.Key as string; + break; + } + + if (foundKey is null || !Enum.TryParse(targetType, foundKey, out var result)) + return fallback; + return result; + } + + var enumString = Enum.GetName(enumValue.GetType(), value); + if (enumString is null) + return string.Empty; + return Strings.ResourceManager.GetString(enumString, Strings.Culture) ?? enumString; + } + + /// + /// Converts a value back from a string representation to its corresponding enumeration value. + /// + /// The value to be converted back. Expected to be a string representation of an enumeration. + /// The type of the enumeration to which the value will be converted. + /// An optional parameter that can be used for custom conversion logic. + /// The culture information to use during the conversion process. + /// + /// Returns the enumeration value corresponding to the string representation. If the conversion fails, + /// a default value of the enumeration is returned. + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file From adb29202cef1d4b507094111799a5db0c24251e8 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 14:00:44 +0100 Subject: [PATCH 16/21] Add empty variants of FilePath and Int32 validators. Signed-off-by: Manuel Ullmann --- .../EmptyOrFilePathValidator.cs | 23 +++++++++++++++++++ .../EmptyOrInt32Validator.cs | 23 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 Source/NETworkManager.Validators/EmptyOrFilePathValidator.cs create mode 100644 Source/NETworkManager.Validators/EmptyOrInt32Validator.cs diff --git a/Source/NETworkManager.Validators/EmptyOrFilePathValidator.cs b/Source/NETworkManager.Validators/EmptyOrFilePathValidator.cs new file mode 100644 index 0000000000..00903bd89e --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrFilePathValidator.cs @@ -0,0 +1,23 @@ +using System.Globalization; +using System.Windows.Controls; + +namespace NETworkManager.Validators; + +public class EmptyOrFilePathValidator : ValidationRule +{ + private static FilePathValidator FilePathValidator + { + get + { + field ??= new FilePathValidator(); + return field; + } + } + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (value is not string strValue || string.IsNullOrEmpty(strValue)) + return ValidationResult.ValidResult; + return FilePathValidator.Validate(value, cultureInfo); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrInt32Validator.cs b/Source/NETworkManager.Validators/EmptyOrInt32Validator.cs new file mode 100644 index 0000000000..0b2d25e2a6 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrInt32Validator.cs @@ -0,0 +1,23 @@ +using System.Globalization; +using System.Windows.Controls; + +namespace NETworkManager.Validators; + +public class EmptyOrInt32Validator : ValidationRule +{ + private static Int32Validator Int32Validator + { + get + { + field ??= new Int32Validator(); + return field; + } + } + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (value is string strValue && string.IsNullOrEmpty(strValue)) + return ValidationResult.ValidResult; + return Int32Validator.Validate(value, cultureInfo); + } +} \ No newline at end of file From 3d29a0b85c3db805a7ace0740fbd2883c2946b3a Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 14:17:56 +0100 Subject: [PATCH 17/21] Fix 2 warnings in ProfilesView. Scnr. Signed-off-by: Manuel Ullmann --- Source/NETworkManager/Views/ProfilesView.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/NETworkManager/Views/ProfilesView.xaml b/Source/NETworkManager/Views/ProfilesView.xaml index b6e4283a3a..1506748b6f 100644 --- a/Source/NETworkManager/Views/ProfilesView.xaml +++ b/Source/NETworkManager/Views/ProfilesView.xaml @@ -434,7 +434,7 @@ - + @@ -443,7 +443,7 @@ - + From 65969a5025df56f660598b54428c6e6705107026 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 14:20:40 +0100 Subject: [PATCH 18/21] Add localization strings for Firewall application. Separate commit to simplify merge conflicts. Signed-off-by: Manuel Ullmann --- .../Resources/Strings.Designer.cs | 3112 ++++++++++------- .../Resources/Strings.cs-CZ.resx | 159 + .../Resources/Strings.de-DE.resx | 167 +- .../Resources/Strings.es-ES.resx | 159 + .../Resources/Strings.fr-FR.resx | 156 + .../Resources/Strings.hu-HU.resx | 159 + .../Resources/Strings.it-IT.resx | 156 + .../Resources/Strings.ja-JP.resx | 156 + .../Resources/Strings.ko-KR.resx | 159 + .../Resources/Strings.nl-NL.resx | 159 + .../Resources/Strings.pl-PL.resx | 159 + .../Resources/Strings.pt-BR.resx | 159 + .../Resources/Strings.resx | 165 + .../Resources/Strings.ru-RU.resx | 156 + .../Resources/Strings.sl-SI.resx | 159 + .../Resources/Strings.sv-SE.resx | 156 + .../Resources/Strings.uk-UA.resx | 150 + 17 files changed, 4336 insertions(+), 1310 deletions(-) diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index f7699adf75..dda41cbbad 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 +// This code was generated by a tool. // -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -13,12 +12,12 @@ namespace NETworkManager.Localization.Resources { /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +32,7 @@ internal Strings() { } /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +46,8 @@ internal Strings() { } /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { @@ -61,7 +60,7 @@ internal Strings() { } /// - /// Sucht eine lokalisierte Zeichenfolge, die About ähnelt. + /// Looks up a localized string similar to About. /// public static string About { get { @@ -70,7 +69,7 @@ public static string About { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Steel ähnelt. + /// Looks up a localized string similar to Steel. /// public static string Accen_Steel { get { @@ -79,7 +78,7 @@ public static string Accen_Steel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Accent ähnelt. + /// Looks up a localized string similar to Accent. /// public static string Accent { get { @@ -88,7 +87,7 @@ public static string Accent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Amber ähnelt. + /// Looks up a localized string similar to Amber. /// public static string Accent_Amber { get { @@ -97,7 +96,7 @@ public static string Accent_Amber { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Black ähnelt. + /// Looks up a localized string similar to Black. /// public static string Accent_Black { get { @@ -106,7 +105,7 @@ public static string Accent_Black { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Blue ähnelt. + /// Looks up a localized string similar to Blue. /// public static string Accent_Blue { get { @@ -115,7 +114,7 @@ public static string Accent_Blue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Brown ähnelt. + /// Looks up a localized string similar to Brown. /// public static string Accent_Brown { get { @@ -124,7 +123,7 @@ public static string Accent_Brown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cobalt ähnelt. + /// Looks up a localized string similar to Cobalt. /// public static string Accent_Cobalt { get { @@ -133,7 +132,7 @@ public static string Accent_Cobalt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Crimson ähnelt. + /// Looks up a localized string similar to Crimson. /// public static string Accent_Crimson { get { @@ -142,7 +141,7 @@ public static string Accent_Crimson { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cyan ähnelt. + /// Looks up a localized string similar to Cyan. /// public static string Accent_Cyan { get { @@ -151,7 +150,7 @@ public static string Accent_Cyan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Emerald ähnelt. + /// Looks up a localized string similar to Emerald. /// public static string Accent_Emerald { get { @@ -160,7 +159,7 @@ public static string Accent_Emerald { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Green ähnelt. + /// Looks up a localized string similar to Green. /// public static string Accent_Green { get { @@ -169,7 +168,7 @@ public static string Accent_Green { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Indigo ähnelt. + /// Looks up a localized string similar to Indigo. /// public static string Accent_Indigo { get { @@ -178,7 +177,7 @@ public static string Accent_Indigo { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lime ähnelt. + /// Looks up a localized string similar to Lime. /// public static string Accent_Lime { get { @@ -187,7 +186,7 @@ public static string Accent_Lime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magenta ähnelt. + /// Looks up a localized string similar to Magenta. /// public static string Accent_Magenta { get { @@ -196,7 +195,7 @@ public static string Accent_Magenta { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mauve ähnelt. + /// Looks up a localized string similar to Mauve. /// public static string Accent_Mauve { get { @@ -205,7 +204,7 @@ public static string Accent_Mauve { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Olive ähnelt. + /// Looks up a localized string similar to Olive. /// public static string Accent_Olive { get { @@ -214,7 +213,7 @@ public static string Accent_Olive { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Orange ähnelt. + /// Looks up a localized string similar to Orange. /// public static string Accent_Orange { get { @@ -223,7 +222,7 @@ public static string Accent_Orange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Purple ähnelt. + /// Looks up a localized string similar to Purple. /// public static string Accent_Purple { get { @@ -232,7 +231,7 @@ public static string Accent_Purple { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Red ähnelt. + /// Looks up a localized string similar to Red. /// public static string Accent_Red { get { @@ -241,7 +240,7 @@ public static string Accent_Red { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sienna ähnelt. + /// Looks up a localized string similar to Sienna. /// public static string Accent_Sienna { get { @@ -250,7 +249,7 @@ public static string Accent_Sienna { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Steel ähnelt. + /// Looks up a localized string similar to Steel. /// public static string Accent_Steel { get { @@ -259,7 +258,7 @@ public static string Accent_Steel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Taupe ähnelt. + /// Looks up a localized string similar to Taupe. /// public static string Accent_Taupe { get { @@ -268,7 +267,7 @@ public static string Accent_Taupe { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Teal ähnelt. + /// Looks up a localized string similar to Teal. /// public static string Accent_Teal { get { @@ -277,7 +276,7 @@ public static string Accent_Teal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pink ähnelt. + /// Looks up a localized string similar to Pink. /// public static string Accent_Violet { get { @@ -286,7 +285,7 @@ public static string Accent_Violet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yellow ähnelt. + /// Looks up a localized string similar to Yellow. /// public static string Accent_Yellow { get { @@ -295,7 +294,16 @@ public static string Accent_Yellow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add ähnelt. + /// Looks up a localized string similar to Action. + /// + public static string Action { + get { + return ResourceManager.GetString("Action", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add. /// public static string Add { get { @@ -304,7 +312,7 @@ public static string Add { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a host to monitor ähnelt. + /// Looks up a localized string similar to Add a host to monitor. /// public static string AddAHostToMonitor { get { @@ -313,7 +321,7 @@ public static string AddAHostToMonitor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a DNS lookup... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a DNS lookup.... /// public static string AddATabToPerformADNSLookup { get { @@ -322,7 +330,7 @@ public static string AddATabToPerformADNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a network scan... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a network scan.... /// public static string AddATabToPerformANetworkScan { get { @@ -331,7 +339,7 @@ public static string AddATabToPerformANetworkScan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform an SNMP action... ähnelt. + /// Looks up a localized string similar to Add a tab to perform an SNMP action.... /// public static string AddATabToPerformAnSNMPAction { get { @@ -340,7 +348,7 @@ public static string AddATabToPerformAnSNMPAction { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a ping... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a ping.... /// public static string AddATabToPerformAPing { get { @@ -349,7 +357,7 @@ public static string AddATabToPerformAPing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a port scan... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a port scan.... /// public static string AddATabToPerformAPortScan { get { @@ -358,7 +366,7 @@ public static string AddATabToPerformAPortScan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a SNTP lookup... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a SNTP lookup.... /// public static string AddATabToPerformASNTPLookup { get { @@ -367,7 +375,7 @@ public static string AddATabToPerformASNTPLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to perform a trace... ähnelt. + /// Looks up a localized string similar to Add a tab to perform a trace.... /// public static string AddATabToPerformATrace { get { @@ -376,7 +384,7 @@ public static string AddATabToPerformATrace { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to query the IP geolocation... ähnelt. + /// Looks up a localized string similar to Add a tab to query the IP geolocation.... /// public static string AddATabToQueryTheIPGeolocation { get { @@ -385,7 +393,7 @@ public static string AddATabToQueryTheIPGeolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add a tab to query whois... ähnelt. + /// Looks up a localized string similar to Add a tab to query whois.... /// public static string AddATabToQueryWhois { get { @@ -394,7 +402,7 @@ public static string AddATabToQueryWhois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add credentials ähnelt. + /// Looks up a localized string similar to Add credentials. /// public static string AddCredentials { get { @@ -403,7 +411,7 @@ public static string AddCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add custom command ähnelt. + /// Looks up a localized string similar to Add custom command. /// public static string AddCustomCommand { get { @@ -412,7 +420,7 @@ public static string AddCustomCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add DNS server ähnelt. + /// Looks up a localized string similar to Add DNS server. /// public static string AddDNSServer { get { @@ -421,7 +429,7 @@ public static string AddDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add DNS suffix (primary) to hostname ähnelt. + /// Looks up a localized string similar to Add DNS suffix (primary) to hostname. /// public static string AddDNSSuffixToHostname { get { @@ -430,7 +438,7 @@ public static string AddDNSSuffixToHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add... ähnelt. + /// Looks up a localized string similar to Add.... /// public static string AddDots { get { @@ -439,7 +447,7 @@ public static string AddDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add entry ähnelt. + /// Looks up a localized string similar to Add entry. /// public static string AddEntry { get { @@ -448,7 +456,7 @@ public static string AddEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add entry... ähnelt. + /// Looks up a localized string similar to Add entry.... /// public static string AddEntryDots { get { @@ -457,7 +465,7 @@ public static string AddEntryDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add group ähnelt. + /// Looks up a localized string similar to Add group. /// public static string AddGroup { get { @@ -466,7 +474,7 @@ public static string AddGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add group... ähnelt. + /// Looks up a localized string similar to Add group.... /// public static string AddGroupDots { get { @@ -475,7 +483,7 @@ public static string AddGroupDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add host ähnelt. + /// Looks up a localized string similar to Add host. /// public static string AddHost { get { @@ -484,7 +492,7 @@ public static string AddHost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add IPv4 address ähnelt. + /// Looks up a localized string similar to Add IPv4 address. /// public static string AddIPv4Address { get { @@ -493,7 +501,7 @@ public static string AddIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add IPv4 address... ähnelt. + /// Looks up a localized string similar to Add IPv4 address.... /// public static string AddIPv4AddressDots { get { @@ -502,7 +510,7 @@ public static string AddIPv4AddressDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additional command line ähnelt. + /// Looks up a localized string similar to Additional command line. /// public static string AdditionalCommandLine { get { @@ -511,7 +519,7 @@ public static string AdditionalCommandLine { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additional config... ähnelt. + /// Looks up a localized string similar to Additional config.... /// public static string AdditionalConfigDots { get { @@ -520,7 +528,7 @@ public static string AdditionalConfigDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Additionals ähnelt. + /// Looks up a localized string similar to Additionals. /// public static string Additionals { get { @@ -529,7 +537,7 @@ public static string Additionals { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add OID profile ähnelt. + /// Looks up a localized string similar to Add OID profile. /// public static string AddOIDProfile { get { @@ -538,7 +546,7 @@ public static string AddOIDProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add port profile ähnelt. + /// Looks up a localized string similar to Add port profile. /// public static string AddPortProfile { get { @@ -547,7 +555,7 @@ public static string AddPortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile ähnelt. + /// Looks up a localized string similar to Add profile. /// public static string AddProfile { get { @@ -556,7 +564,7 @@ public static string AddProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile... ähnelt. + /// Looks up a localized string similar to Add profile.... /// public static string AddProfileDots { get { @@ -565,7 +573,7 @@ public static string AddProfileDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add profile file ähnelt. + /// Looks up a localized string similar to Add profile file. /// public static string AddProfileFile { get { @@ -574,7 +582,7 @@ public static string AddProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add server ähnelt. + /// Looks up a localized string similar to Add server. /// public static string AddServer { get { @@ -583,7 +591,7 @@ public static string AddServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add SNTP server ähnelt. + /// Looks up a localized string similar to Add SNTP server. /// public static string AddSNTPServer { get { @@ -592,7 +600,7 @@ public static string AddSNTPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add tab ähnelt. + /// Looks up a localized string similar to Add tab. /// public static string AddTab { get { @@ -601,7 +609,7 @@ public static string AddTab { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add tab... ähnelt. + /// Looks up a localized string similar to Add tab.... /// public static string AddTabDots { get { @@ -610,7 +618,7 @@ public static string AddTabDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Add tag ähnelt. + /// Looks up a localized string similar to Add tag. /// public static string AddTag { get { @@ -619,7 +627,7 @@ public static string AddTag { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Adjust screen ähnelt. + /// Looks up a localized string similar to Adjust screen. /// public static string AdjustScreen { get { @@ -628,7 +636,7 @@ public static string AdjustScreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Adjust screen automatically ähnelt. + /// Looks up a localized string similar to Adjust screen automatically. /// public static string AdjustScreenAutomatically { get { @@ -637,7 +645,7 @@ public static string AdjustScreenAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Admin (console) session ähnelt. + /// Looks up a localized string similar to Admin (console) session. /// public static string AdminConsoleSession { get { @@ -646,7 +654,7 @@ public static string AdminConsoleSession { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Administrator ähnelt. + /// Looks up a localized string similar to Administrator. /// public static string Administrator { get { @@ -655,7 +663,7 @@ public static string Administrator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die All ähnelt. + /// Looks up a localized string similar to All. /// public static string All { get { @@ -664,7 +672,16 @@ public static string All { } /// - /// Sucht eine lokalisierte Zeichenfolge, die All settings can be changed later in the settings! ähnelt. + /// Looks up a localized string similar to Allow. + /// + public static string Allow { + get { + return ResourceManager.GetString("Allow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All settings can be changed later in the settings!. /// public static string AllSettingsCanBeChangedLaterInTheSettings { get { @@ -673,7 +690,16 @@ public static string AllSettingsCanBeChangedLaterInTheSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Always show icon in tray ähnelt. + /// Looks up a localized string similar to Alt. + /// + public static string Alt { + get { + return ResourceManager.GetString("Alt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Always show icon in tray. /// public static string AlwaysShowIconInTray { get { @@ -682,7 +708,7 @@ public static string AlwaysShowIconInTray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Amber ähnelt. + /// Looks up a localized string similar to Amber. /// public static string Amber { get { @@ -691,7 +717,7 @@ public static string Amber { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred while exporting the data. See error message for details: ähnelt. + /// Looks up a localized string similar to An error occurred while exporting the data. See error message for details:. /// public static string AnErrorOccurredWhileExportingTheData { get { @@ -700,7 +726,7 @@ public static string AnErrorOccurredWhileExportingTheData { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Answers ähnelt. + /// Looks up a localized string similar to Answers. /// public static string Answers { get { @@ -709,7 +735,7 @@ public static string Answers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Any ähnelt. + /// Looks up a localized string similar to Any. /// public static string Any { get { @@ -718,7 +744,7 @@ public static string Any { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Appearance ähnelt. + /// Looks up a localized string similar to Appearance. /// public static string Appearance { get { @@ -727,7 +753,7 @@ public static string Appearance { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP Table ähnelt. + /// Looks up a localized string similar to ARP Table. /// public static string ApplicationName_ARPTable { get { @@ -736,7 +762,7 @@ public static string ApplicationName_ARPTable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bit Calculator ähnelt. + /// Looks up a localized string similar to Bit Calculator. /// public static string ApplicationName_BitCalculator { get { @@ -745,7 +771,7 @@ public static string ApplicationName_BitCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connections ähnelt. + /// Looks up a localized string similar to Connections. /// public static string ApplicationName_Connections { get { @@ -754,7 +780,7 @@ public static string ApplicationName_Connections { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dashboard ähnelt. + /// Looks up a localized string similar to Dashboard. /// public static string ApplicationName_Dashboard { get { @@ -763,7 +789,7 @@ public static string ApplicationName_Dashboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Discovery Protocol ähnelt. + /// Looks up a localized string similar to Discovery Protocol. /// public static string ApplicationName_DiscoveryProtocol { get { @@ -772,7 +798,7 @@ public static string ApplicationName_DiscoveryProtocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to DNS Lookup. /// public static string ApplicationName_DNSLookup { get { @@ -781,7 +807,7 @@ public static string ApplicationName_DNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hosts File Editor ähnelt. + /// Looks up a localized string similar to Hosts File Editor. /// public static string ApplicationName_HostsFileEditor { get { @@ -790,7 +816,7 @@ public static string ApplicationName_HostsFileEditor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to HTTP Headers. /// public static string ApplicationName_HTTPHeaders { get { @@ -799,7 +825,7 @@ public static string ApplicationName_HTTPHeaders { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Geolocation ähnelt. + /// Looks up a localized string similar to IP Geolocation. /// public static string ApplicationName_IPGeolocation { get { @@ -808,7 +834,7 @@ public static string ApplicationName_IPGeolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to IP Scanner. /// public static string ApplicationName_IPScanner { get { @@ -817,7 +843,7 @@ public static string ApplicationName_IPScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listeners ähnelt. + /// Looks up a localized string similar to Listeners. /// public static string ApplicationName_Listeners { get { @@ -826,7 +852,7 @@ public static string ApplicationName_Listeners { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lookup ähnelt. + /// Looks up a localized string similar to Lookup. /// public static string ApplicationName_Lookup { get { @@ -835,7 +861,7 @@ public static string ApplicationName_Lookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network Interface ähnelt. + /// Looks up a localized string similar to Network Interface. /// public static string ApplicationName_NetworkInterface { get { @@ -844,7 +870,7 @@ public static string ApplicationName_NetworkInterface { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping ähnelt. + /// Looks up a localized string similar to Ping. /// public static string ApplicationName_Ping { get { @@ -853,7 +879,7 @@ public static string ApplicationName_Ping { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Ping Monitor. /// public static string ApplicationName_PingMonitor { get { @@ -862,7 +888,7 @@ public static string ApplicationName_PingMonitor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to Port Scanner. /// public static string ApplicationName_PortScanner { get { @@ -871,7 +897,7 @@ public static string ApplicationName_PortScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to PowerShell. /// public static string ApplicationName_PowerShell { get { @@ -880,7 +906,7 @@ public static string ApplicationName_PowerShell { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to PuTTY. /// public static string ApplicationName_PuTTY { get { @@ -889,7 +915,7 @@ public static string ApplicationName_PuTTY { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to Remote Desktop. /// public static string ApplicationName_RemoteDesktop { get { @@ -898,7 +924,7 @@ public static string ApplicationName_RemoteDesktop { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNMP ähnelt. + /// Looks up a localized string similar to SNMP. /// public static string ApplicationName_SNMP { get { @@ -907,7 +933,7 @@ public static string ApplicationName_SNMP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNTP Lookup ähnelt. + /// Looks up a localized string similar to SNTP Lookup. /// public static string ApplicationName_SNTPLookup { get { @@ -916,7 +942,7 @@ public static string ApplicationName_SNTPLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet Calculator ähnelt. + /// Looks up a localized string similar to Subnet Calculator. /// public static string ApplicationName_SubnetCalculator { get { @@ -925,7 +951,7 @@ public static string ApplicationName_SubnetCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to TigerVNC. /// public static string ApplicationName_TigerVNC { get { @@ -934,7 +960,7 @@ public static string ApplicationName_TigerVNC { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to Traceroute. /// public static string ApplicationName_Traceroute { get { @@ -943,7 +969,7 @@ public static string ApplicationName_Traceroute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake on LAN ähnelt. + /// Looks up a localized string similar to Wake on LAN. /// public static string ApplicationName_WakeOnLAN { get { @@ -952,7 +978,7 @@ public static string ApplicationName_WakeOnLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Web Console ähnelt. + /// Looks up a localized string similar to Web Console. /// public static string ApplicationName_WebConsole { get { @@ -961,7 +987,7 @@ public static string ApplicationName_WebConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to Whois. /// public static string ApplicationName_Whois { get { @@ -970,7 +996,7 @@ public static string ApplicationName_Whois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WiFi ähnelt. + /// Looks up a localized string similar to WiFi. /// public static string ApplicationName_WiFi { get { @@ -979,7 +1005,7 @@ public static string ApplicationName_WiFi { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Applications ähnelt. + /// Looks up a localized string similar to Applications. /// public static string Applications { get { @@ -988,7 +1014,7 @@ public static string Applications { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application will be restarted afterwards! ähnelt. + /// Looks up a localized string similar to The application will be restarted afterwards!. /// public static string ApplicationWillBeRestartedAfterwards { get { @@ -997,7 +1023,7 @@ public static string ApplicationWillBeRestartedAfterwards { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply ähnelt. + /// Looks up a localized string similar to Apply. /// public static string Apply { get { @@ -1006,7 +1032,7 @@ public static string Apply { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply filter ähnelt. + /// Looks up a localized string similar to Apply filter. /// public static string ApplyFilter { get { @@ -1015,7 +1041,7 @@ public static string ApplyFilter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply theme to PowerShell console ähnelt. + /// Looks up a localized string similar to Apply theme to PowerShell console. /// public static string ApplyThemeToPowerShellConsole { get { @@ -1024,7 +1050,7 @@ public static string ApplyThemeToPowerShellConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply Windows key combinations ähnelt. + /// Looks up a localized string similar to Apply Windows key combinations. /// public static string ApplyWindowsKeyCombinations { get { @@ -1033,7 +1059,7 @@ public static string ApplyWindowsKeyCombinations { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apply Windows key combinations (e.g., ALT+TAB): ähnelt. + /// Looks up a localized string similar to Apply Windows key combinations (e.g., ALT+TAB):. /// public static string ApplyWindowsKeyCombinationsLikeAltTab { get { @@ -1042,7 +1068,7 @@ public static string ApplyWindowsKeyCombinationsLikeAltTab { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Are you sure? ähnelt. + /// Looks up a localized string similar to Are you sure?. /// public static string AreYouSure { get { @@ -1051,7 +1077,7 @@ public static string AreYouSure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Arguments ähnelt. + /// Looks up a localized string similar to Arguments. /// public static string Arguments { get { @@ -1060,7 +1086,7 @@ public static string Arguments { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP ähnelt. + /// Looks up a localized string similar to ARP. /// public static string ARP { get { @@ -1069,7 +1095,7 @@ public static string ARP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ARP Table ähnelt. + /// Looks up a localized string similar to ARP Table. /// public static string ARPTable { get { @@ -1078,7 +1104,7 @@ public static string ARPTable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ASN ähnelt. + /// Looks up a localized string similar to ASN. /// public static string ASN { get { @@ -1087,7 +1113,7 @@ public static string ASN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die AS Name ähnelt. + /// Looks up a localized string similar to AS Name. /// public static string ASName { get { @@ -1096,7 +1122,7 @@ public static string ASName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die At least one application must be visible! ähnelt. + /// Looks up a localized string similar to At least one application must be visible!. /// public static string AtLeastOneApplicationMustBeVisible { get { @@ -1105,7 +1131,16 @@ public static string AtLeastOneApplicationMustBeVisible { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Attempts ähnelt. + /// Looks up a localized string similar to At least one network profile must be selected!. + /// + public static string AtLeastOneNetworkProfileMustBeSelected { + get { + return ResourceManager.GetString("AtLeastOneNetworkProfileMustBeSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attempts. /// public static string Attempts { get { @@ -1114,7 +1149,7 @@ public static string Attempts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Auth ähnelt. + /// Looks up a localized string similar to Auth. /// public static string Auth { get { @@ -1123,7 +1158,7 @@ public static string Auth { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication ähnelt. + /// Looks up a localized string similar to Authentication. /// public static string Authentication { get { @@ -1132,7 +1167,7 @@ public static string Authentication { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication level ähnelt. + /// Looks up a localized string similar to Authentication level. /// public static string AuthenticationLevel { get { @@ -1141,7 +1176,7 @@ public static string AuthenticationLevel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authorities ähnelt. + /// Looks up a localized string similar to Authorities. /// public static string Authorities { get { @@ -1150,7 +1185,7 @@ public static string Authorities { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Automatically update every ähnelt. + /// Looks up a localized string similar to Automatically update every. /// public static string AutomaticallyUpdateEvery { get { @@ -1159,7 +1194,7 @@ public static string AutomaticallyUpdateEvery { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. + /// Looks up a localized string similar to Autostart. /// public static string Autostart { get { @@ -1168,7 +1203,7 @@ public static string Autostart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Average time ähnelt. + /// Looks up a localized string similar to Average time. /// public static string AverageTime { get { @@ -1177,7 +1212,7 @@ public static string AverageTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die back ähnelt. + /// Looks up a localized string similar to back. /// public static string Back { get { @@ -1186,7 +1221,7 @@ public static string Back { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Background job ähnelt. + /// Looks up a localized string similar to Background job. /// public static string BackgroundJob { get { @@ -1195,7 +1230,7 @@ public static string BackgroundJob { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Backup ähnelt. + /// Looks up a localized string similar to Backup. /// public static string Backup { get { @@ -1204,7 +1239,7 @@ public static string Backup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bandwidth ähnelt. + /// Looks up a localized string similar to Bandwidth. /// public static string Bandwidth { get { @@ -1213,7 +1248,7 @@ public static string Bandwidth { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Baud ähnelt. + /// Looks up a localized string similar to Baud. /// public static string Baud { get { @@ -1222,7 +1257,7 @@ public static string Baud { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Baud rate ähnelt. + /// Looks up a localized string similar to Baud rate. /// public static string BaudRate { get { @@ -1231,7 +1266,7 @@ public static string BaudRate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Beacon interval ähnelt. + /// Looks up a localized string similar to Beacon interval. /// public static string BeaconInterval { get { @@ -1240,7 +1275,7 @@ public static string BeaconInterval { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bit Calculator ähnelt. + /// Looks up a localized string similar to Bit Calculator. /// public static string BitCalculator { get { @@ -1249,7 +1284,7 @@ public static string BitCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bits ähnelt. + /// Looks up a localized string similar to Bits. /// public static string Bits { get { @@ -1258,7 +1293,7 @@ public static string Bits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Black ähnelt. + /// Looks up a localized string similar to Black. /// public static string Black { get { @@ -1267,7 +1302,16 @@ public static string Black { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Blue ähnelt. + /// Looks up a localized string similar to Block. + /// + public static string Block { + get { + return ResourceManager.GetString("Block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blue. /// public static string Blue { get { @@ -1276,7 +1320,7 @@ public static string Blue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Broadcast ähnelt. + /// Looks up a localized string similar to Broadcast. /// public static string Broadcast { get { @@ -1285,7 +1329,7 @@ public static string Broadcast { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Brown ähnelt. + /// Looks up a localized string similar to Brown. /// public static string Brown { get { @@ -1294,7 +1338,7 @@ public static string Brown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Browser ähnelt. + /// Looks up a localized string similar to Browser. /// public static string Browser { get { @@ -1303,7 +1347,7 @@ public static string Browser { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Browsing Data ähnelt. + /// Looks up a localized string similar to Browsing Data. /// public static string BrowsingData { get { @@ -1312,7 +1356,7 @@ public static string BrowsingData { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred while deleting browsing data. Feel free to report this issue on GitHub. ähnelt. + /// Looks up a localized string similar to An error occurred while deleting browsing data. Feel free to report this issue on GitHub.. /// public static string BrowsingDataErrorMessage { get { @@ -1321,7 +1365,7 @@ public static string BrowsingDataErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Browsing data successfully deleted! ähnelt. + /// Looks up a localized string similar to Browsing data successfully deleted!. /// public static string BrowsingDataSuccessfullyDeletedMessage { get { @@ -1330,7 +1374,7 @@ public static string BrowsingDataSuccessfullyDeletedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die BSSID ähnelt. + /// Looks up a localized string similar to BSSID. /// public static string BSSID { get { @@ -1339,7 +1383,7 @@ public static string BSSID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Buffer ähnelt. + /// Looks up a localized string similar to Buffer. /// public static string Buffer { get { @@ -1348,7 +1392,7 @@ public static string Buffer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bypass for local addresses ähnelt. + /// Looks up a localized string similar to Bypass for local addresses. /// public static string BypassForLocalAddresses { get { @@ -1357,7 +1401,7 @@ public static string BypassForLocalAddresses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bytes ähnelt. + /// Looks up a localized string similar to Bytes. /// public static string Bytes { get { @@ -1366,7 +1410,7 @@ public static string Bytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Calculate ähnelt. + /// Looks up a localized string similar to Calculate. /// public static string Calculate { get { @@ -1375,7 +1419,7 @@ public static string Calculate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Calculator ähnelt. + /// Looks up a localized string similar to Calculator. /// public static string Calculator { get { @@ -1384,7 +1428,7 @@ public static string Calculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cancel ähnelt. + /// Looks up a localized string similar to Cancel. /// public static string Cancel { get { @@ -1393,7 +1437,7 @@ public static string Cancel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The operation has been canceled by the user! ähnelt. + /// Looks up a localized string similar to The operation has been canceled by the user!. /// public static string CanceledByUserMessage { get { @@ -1402,7 +1446,7 @@ public static string CanceledByUserMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host cannot be set while other hosts are being added. Please wait until the process is complete and try again. ähnelt. + /// Looks up a localized string similar to Host cannot be set while other hosts are being added. Please wait until the process is complete and try again.. /// public static string CannotSetHostWhileRunningMessage { get { @@ -1411,7 +1455,7 @@ public static string CannotSetHostWhileRunningMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Caps lock is enabled! ähnelt. + /// Looks up a localized string similar to Caps lock is enabled!. /// public static string CapsLockIsEnabled { get { @@ -1420,7 +1464,7 @@ public static string CapsLockIsEnabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture ähnelt. + /// Looks up a localized string similar to Capture. /// public static string Capture { get { @@ -1429,7 +1473,7 @@ public static string Capture { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture network packets to view LLDP or CDP information! ähnelt. + /// Looks up a localized string similar to Capture network packets to view LLDP or CDP information!. /// public static string CaptureNetworkPacketsToViewLLDPorCDPInformation { get { @@ -1438,7 +1482,7 @@ public static string CaptureNetworkPacketsToViewLLDPorCDPInformation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capturing network packages... ähnelt. + /// Looks up a localized string similar to Capturing network packages.... /// public static string CapturingNetworkPackagesDots { get { @@ -1447,7 +1491,7 @@ public static string CapturingNetworkPackagesDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change ähnelt. + /// Looks up a localized string similar to Change. /// public static string Change { get { @@ -1456,7 +1500,7 @@ public static string Change { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change location? ähnelt. + /// Looks up a localized string similar to Change location?. /// public static string ChangeLocationQuestion { get { @@ -1465,7 +1509,7 @@ public static string ChangeLocationQuestion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Changelog ähnelt. + /// Looks up a localized string similar to Changelog. /// public static string Changelog { get { @@ -1474,7 +1518,7 @@ public static string Changelog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change master password ähnelt. + /// Looks up a localized string similar to Change master password. /// public static string ChangeMasterPassword { get { @@ -1483,7 +1527,7 @@ public static string ChangeMasterPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Change Master Password... ähnelt. + /// Looks up a localized string similar to Change Master Password.... /// public static string ChangeMasterPasswordDots { get { @@ -1492,9 +1536,9 @@ public static string ChangeMasterPasswordDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The profiles location is changed and the application is restarted afterwards. + /// Looks up a localized string similar to The profiles location is changed and the application is restarted afterwards. /// - ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. ähnelt. + ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten.. /// public static string ChangeProfilesLocationMessage { get { @@ -1503,9 +1547,9 @@ public static string ChangeProfilesLocationMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings location is changed and the application is restarted afterwards. + /// Looks up a localized string similar to The settings location is changed and the application is restarted afterwards. /// - ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. ähnelt. + ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten.. /// public static string ChangeSettingsLocationMessage { get { @@ -1514,7 +1558,7 @@ public static string ChangeSettingsLocationMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Channel ähnelt. + /// Looks up a localized string similar to Channel. /// public static string Channel { get { @@ -1523,7 +1567,7 @@ public static string Channel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Channels ähnelt. + /// Looks up a localized string similar to Channels. /// public static string Channels { get { @@ -1532,7 +1576,7 @@ public static string Channels { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Chassis Id ähnelt. + /// Looks up a localized string similar to Chassis Id. /// public static string ChassisId { get { @@ -1541,7 +1585,7 @@ public static string ChassisId { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check ähnelt. + /// Looks up a localized string similar to Check. /// public static string Check { get { @@ -1550,7 +1594,7 @@ public static string Check { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check DNS resolver ähnelt. + /// Looks up a localized string similar to Check DNS resolver. /// public static string CheckDNSResolver { get { @@ -1559,7 +1603,7 @@ public static string CheckDNSResolver { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check for pre-releases ähnelt. + /// Looks up a localized string similar to Check for pre-releases. /// public static string CheckForPreReleases { get { @@ -1568,7 +1612,7 @@ public static string CheckForPreReleases { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check for updates ähnelt. + /// Looks up a localized string similar to Check for updates. /// public static string CheckForUpdates { get { @@ -1577,7 +1621,7 @@ public static string CheckForUpdates { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check for updates at startup ähnelt. + /// Looks up a localized string similar to Check for updates at startup. /// public static string CheckForUpdatesAtStartup { get { @@ -1586,7 +1630,7 @@ public static string CheckForUpdatesAtStartup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Checking DNS resolver... ähnelt. + /// Looks up a localized string similar to Checking DNS resolver.... /// public static string CheckingDNSResolverDots { get { @@ -1595,7 +1639,7 @@ public static string CheckingDNSResolverDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Checking IP geolocation... ähnelt. + /// Looks up a localized string similar to Checking IP geolocation.... /// public static string CheckingIPGeolocationDots { get { @@ -1604,7 +1648,7 @@ public static string CheckingIPGeolocationDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Checking WPS... ähnelt. + /// Looks up a localized string similar to Checking WPS.... /// public static string CheckingWPSDots { get { @@ -1613,7 +1657,7 @@ public static string CheckingWPSDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check IP geolocation ähnelt. + /// Looks up a localized string similar to Check IP geolocation. /// public static string CheckIPGeolocation { get { @@ -1622,7 +1666,7 @@ public static string CheckIPGeolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check is disabled! ähnelt. + /// Looks up a localized string similar to Check is disabled!. /// public static string CheckIsDisabled { get { @@ -1631,7 +1675,7 @@ public static string CheckIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check your network adapter configuration (dns) and if your dns server is configured correctly. ähnelt. + /// Looks up a localized string similar to Check your network adapter configuration (dns) and if your dns server is configured correctly.. /// public static string CheckNetworkAdapterConfigurationAndDNSServerConfigurationMessage { get { @@ -1640,7 +1684,7 @@ public static string CheckNetworkAdapterConfigurationAndDNSServerConfigurationMe } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check your network adapter configuration (dhcp, static ip) and if you are connected to a network. ähnelt. + /// Looks up a localized string similar to Check your network adapter configuration (dhcp, static ip) and if you are connected to a network.. /// public static string CheckNetworkAdapterConfigurationAndNetworkConnectionMessage { get { @@ -1649,7 +1693,7 @@ public static string CheckNetworkAdapterConfigurationAndNetworkConnectionMessage } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check your network connection and try again in a few seconds. ähnelt. + /// Looks up a localized string similar to Check your network connection and try again in a few seconds.. /// public static string CheckNetworkConnectionTryAgainMessage { get { @@ -1658,7 +1702,7 @@ public static string CheckNetworkConnectionTryAgainMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Check public IP address ähnelt. + /// Looks up a localized string similar to Check public IP address. /// public static string CheckPublicIPAddress { get { @@ -1667,7 +1711,7 @@ public static string CheckPublicIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CIDR ähnelt. + /// Looks up a localized string similar to CIDR. /// public static string CIDR { get { @@ -1676,7 +1720,7 @@ public static string CIDR { } /// - /// Sucht eine lokalisierte Zeichenfolge, die City ähnelt. + /// Looks up a localized string similar to City. /// public static string City { get { @@ -1685,7 +1729,7 @@ public static string City { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Class ähnelt. + /// Looks up a localized string similar to Class. /// public static string Class { get { @@ -1694,7 +1738,7 @@ public static string Class { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Clear filter ähnelt. + /// Looks up a localized string similar to Clear filter. /// public static string ClearFilter { get { @@ -1703,7 +1747,16 @@ public static string ClearFilter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Client ähnelt. + /// Looks up a localized string similar to Clear rules in Windows. + /// + public static string ClearRulesInWindows { + get { + return ResourceManager.GetString("ClearRulesInWindows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Client. /// public static string Client { get { @@ -1712,7 +1765,7 @@ public static string Client { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Close ähnelt. + /// Looks up a localized string similar to Close. /// public static string Close { get { @@ -1721,7 +1774,7 @@ public static string Close { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Close all ähnelt. + /// Looks up a localized string similar to Close all. /// public static string CloseAll { get { @@ -1730,7 +1783,7 @@ public static string CloseAll { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to Closed. /// public static string Closed { get { @@ -1739,7 +1792,7 @@ public static string Closed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Close group ähnelt. + /// Looks up a localized string similar to Close group. /// public static string CloseGroup { get { @@ -1748,7 +1801,7 @@ public static string CloseGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closing in {0} seconds... ähnelt. + /// Looks up a localized string similar to Closing in {0} seconds.... /// public static string ClosingInXSecondsDots { get { @@ -1757,7 +1810,7 @@ public static string ClosingInXSecondsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not export file! See error message: "{0}" ähnelt. + /// Looks up a localized string similar to Could not export file! See error message: "{0}". /// public static string ClouldNotExportFileSeeErrorMessageXX { get { @@ -1766,7 +1819,7 @@ public static string ClouldNotExportFileSeeErrorMessageXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not import file! See error message: "{0}" ähnelt. + /// Looks up a localized string similar to Could not import file! See error message: "{0}". /// public static string ClouldNotImportFileSeeErrorMessageXX { get { @@ -1775,7 +1828,7 @@ public static string ClouldNotImportFileSeeErrorMessageXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cobalt ähnelt. + /// Looks up a localized string similar to Cobalt. /// public static string Cobalt { get { @@ -1784,7 +1837,7 @@ public static string Cobalt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Collapse all ähnelt. + /// Looks up a localized string similar to Collapse all. /// public static string CollapseAll { get { @@ -1793,7 +1846,7 @@ public static string CollapseAll { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Color depth (bit) ähnelt. + /// Looks up a localized string similar to Color depth (bit). /// public static string ColorDepthBit { get { @@ -1802,7 +1855,16 @@ public static string ColorDepthBit { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Command ähnelt. + /// Looks up a localized string similar to Combine local and remote port history. + /// + public static string CombineLocalAndRemotePortHistory { + get { + return ResourceManager.GetString("CombineLocalAndRemotePortHistory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Command. /// public static string Command { get { @@ -1811,7 +1873,7 @@ public static string Command { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Command Line Arguments ähnelt. + /// Looks up a localized string similar to Command Line Arguments. /// public static string CommandLineArguments { get { @@ -1820,7 +1882,7 @@ public static string CommandLineArguments { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Comment ähnelt. + /// Looks up a localized string similar to Comment. /// public static string Comment { get { @@ -1829,7 +1891,7 @@ public static string Comment { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Community ähnelt. + /// Looks up a localized string similar to Community. /// public static string Community { get { @@ -1838,7 +1900,7 @@ public static string Community { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Computer ähnelt. + /// Looks up a localized string similar to Computer. /// public static string Computer { get { @@ -1847,7 +1909,7 @@ public static string Computer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Computer name ähnelt. + /// Looks up a localized string similar to Computer name. /// public static string ComputerName { get { @@ -1856,7 +1918,7 @@ public static string ComputerName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure ähnelt. + /// Looks up a localized string similar to Configure. /// public static string Configure { get { @@ -1865,7 +1927,7 @@ public static string Configure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to PowerShell in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to PowerShell in the settings.... /// public static string ConfigureThePathToPowerShellInTheSettingsDots { get { @@ -1874,7 +1936,7 @@ public static string ConfigureThePathToPowerShellInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to PuTTY in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to PuTTY in the settings.... /// public static string ConfigureThePathToPuTTYInTheSettingsDots { get { @@ -1883,7 +1945,7 @@ public static string ConfigureThePathToPuTTYInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Configure the path to TigerVNC in the settings... ähnelt. + /// Looks up a localized string similar to Configure the path to TigerVNC in the settings.... /// public static string ConfigureThePathToTigerVNCInTheSettingsDots { get { @@ -1892,7 +1954,7 @@ public static string ConfigureThePathToTigerVNCInTheSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Confirm ähnelt. + /// Looks up a localized string similar to Confirm. /// public static string Confirm { get { @@ -1901,7 +1963,7 @@ public static string Confirm { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Confirm close ähnelt. + /// Looks up a localized string similar to Confirm close. /// public static string ConfirmClose { get { @@ -1910,7 +1972,7 @@ public static string ConfirmClose { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Are you sure you want to close the application? ähnelt. + /// Looks up a localized string similar to Are you sure you want to close the application?. /// public static string ConfirmCloseMessage { get { @@ -1919,7 +1981,7 @@ public static string ConfirmCloseMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect ähnelt. + /// Looks up a localized string similar to Connect. /// public static string Connect { get { @@ -1928,7 +1990,7 @@ public static string Connect { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect as ähnelt. + /// Looks up a localized string similar to Connect as. /// public static string ConnectAs { get { @@ -1937,7 +1999,7 @@ public static string ConnectAs { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect as... ähnelt. + /// Looks up a localized string similar to Connect as.... /// public static string ConnectAsDots { get { @@ -1946,7 +2008,7 @@ public static string ConnectAsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect automatically ähnelt. + /// Looks up a localized string similar to Connect automatically. /// public static string ConnectAutomatically { get { @@ -1955,7 +2017,7 @@ public static string ConnectAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect... ähnelt. + /// Looks up a localized string similar to Connect.... /// public static string ConnectDots { get { @@ -1964,7 +2026,7 @@ public static string ConnectDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connected ähnelt. + /// Looks up a localized string similar to Connected. /// public static string Connected { get { @@ -1973,7 +2035,7 @@ public static string Connected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect external ähnelt. + /// Looks up a localized string similar to Connect external. /// public static string ConnectExternal { get { @@ -1982,7 +2044,7 @@ public static string ConnectExternal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connecting... ähnelt. + /// Looks up a localized string similar to Connecting.... /// public static string ConnectingDots { get { @@ -1991,7 +2053,7 @@ public static string ConnectingDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connecting to {0}... ähnelt. + /// Looks up a localized string similar to Connecting to {0}.... /// public static string ConnectingToXXX { get { @@ -2000,7 +2062,7 @@ public static string ConnectingToXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connection ähnelt. + /// Looks up a localized string similar to Connection. /// public static string Connection { get { @@ -2009,7 +2071,7 @@ public static string Connection { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connections ähnelt. + /// Looks up a localized string similar to Connections. /// public static string Connections { get { @@ -2018,7 +2080,7 @@ public static string Connections { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error ähnelt. + /// Looks up a localized string similar to Error. /// public static string ConnectionState_Error { get { @@ -2027,7 +2089,7 @@ public static string ConnectionState_Error { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. + /// Looks up a localized string similar to OK. /// public static string ConnectionState_OK { get { @@ -2036,7 +2098,7 @@ public static string ConnectionState_OK { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Warning ähnelt. + /// Looks up a localized string similar to Warning. /// public static string ConnectionState_Warning { get { @@ -2045,7 +2107,7 @@ public static string ConnectionState_Warning { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect the network card to a network to configure it! ähnelt. + /// Looks up a localized string similar to Connect the network card to a network to configure it!. /// public static string ConnectTheNetworkCardToConfigureIt { get { @@ -2054,7 +2116,7 @@ public static string ConnectTheNetworkCardToConfigureIt { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connect to {0} ähnelt. + /// Looks up a localized string similar to Connect to {0}. /// public static string ConnectToXXX { get { @@ -2063,7 +2125,7 @@ public static string ConnectToXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Continent ähnelt. + /// Looks up a localized string similar to Continent. /// public static string Continent { get { @@ -2072,7 +2134,7 @@ public static string Continent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Continue ähnelt. + /// Looks up a localized string similar to Continue. /// public static string Continue { get { @@ -2081,7 +2143,7 @@ public static string Continue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy ähnelt. + /// Looks up a localized string similar to Copy. /// public static string Copy { get { @@ -2090,7 +2152,7 @@ public static string Copy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy as... ähnelt. + /// Looks up a localized string similar to Copy as.... /// public static string CopyAsDots { get { @@ -2099,7 +2161,7 @@ public static string CopyAsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy... ähnelt. + /// Looks up a localized string similar to Copy.... /// public static string CopyDots { get { @@ -2108,7 +2170,7 @@ public static string CopyDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy ähnelt. + /// Looks up a localized string similar to Copy. /// public static string CopyNoun { get { @@ -2117,7 +2179,7 @@ public static string CopyNoun { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Copy profile ähnelt. + /// Looks up a localized string similar to Copy profile. /// public static string CopyProfile { get { @@ -2126,7 +2188,7 @@ public static string CopyProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not connect to "{0}"! ähnelt. + /// Looks up a localized string similar to Could not connect to "{0}"!. /// public static string CouldNotConnectToXXXMessage { get { @@ -2135,7 +2197,7 @@ public static string CouldNotConnectToXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not connect to {0} ({1})! ähnelt. + /// Looks up a localized string similar to Could not connect to {0} ({1})!. /// public static string CouldNotConnectToXXXReasonXXX { get { @@ -2144,7 +2206,7 @@ public static string CouldNotConnectToXXXReasonXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect gateway ip address! ähnelt. + /// Looks up a localized string similar to Could not detect gateway ip address!. /// public static string CouldNotDetectGatewayIPAddressMessage { get { @@ -2153,7 +2215,7 @@ public static string CouldNotDetectGatewayIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect local ip address! ähnelt. + /// Looks up a localized string similar to Could not detect local ip address!. /// public static string CouldNotDetectLocalIPAddressMessage { get { @@ -2162,7 +2224,7 @@ public static string CouldNotDetectLocalIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not detect subnetmask! ähnelt. + /// Looks up a localized string similar to Could not detect subnetmask!. /// public static string CouldNotDetectSubnetmask { get { @@ -2171,7 +2233,7 @@ public static string CouldNotDetectSubnetmask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not find the application "{0}". Maybe the application was hidden in the settings? ähnelt. + /// Looks up a localized string similar to Could not find the application "{0}". Maybe the application was hidden in the settings?. /// public static string CouldNotFindApplicationXXXMessage { get { @@ -2180,7 +2242,7 @@ public static string CouldNotFindApplicationXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.). ähnelt. + /// Looks up a localized string similar to Could not get public ip address via WebRequest (http/https) from "{0}"! Check your network connection (firewall, proxy, etc.).. /// public static string CouldNotGetPublicIPAddressFromXXXMessage { get { @@ -2189,7 +2251,7 @@ public static string CouldNotGetPublicIPAddressFromXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not parse or resolve any of the specified DNS servers. ähnelt. + /// Looks up a localized string similar to Could not parse or resolve any of the specified DNS servers.. /// public static string CouldNotParseOrResolveDNSServers { get { @@ -2198,7 +2260,7 @@ public static string CouldNotParseOrResolveDNSServers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not parse public ip address from "{0}"! Try another service or use the default... ähnelt. + /// Looks up a localized string similar to Could not parse public ip address from "{0}"! Try another service or use the default... . /// public static string CouldNotParsePublicIPAddressFromXXXMessage { get { @@ -2207,7 +2269,7 @@ public static string CouldNotParsePublicIPAddressFromXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not parse "{0}". ähnelt. + /// Looks up a localized string similar to Could not parse "{0}".. /// public static string CouldNotParseX { get { @@ -2216,7 +2278,7 @@ public static string CouldNotParseX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve hostname for: "{0}" ähnelt. + /// Looks up a localized string similar to Could not resolve hostname for: "{0}". /// public static string CouldNotResolveHostnameFor { get { @@ -2225,7 +2287,7 @@ public static string CouldNotResolveHostnameFor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve ip address for: "{0}" ähnelt. + /// Looks up a localized string similar to Could not resolve ip address for: "{0}". /// public static string CouldNotResolveIPAddressFor { get { @@ -2234,7 +2296,7 @@ public static string CouldNotResolveIPAddressFor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not send keystroke! ähnelt. + /// Looks up a localized string similar to Could not send keystroke!. /// public static string CouldNotSendKeystroke { get { @@ -2243,7 +2305,7 @@ public static string CouldNotSendKeystroke { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Country ähnelt. + /// Looks up a localized string similar to Country. /// public static string Country { get { @@ -2252,7 +2314,7 @@ public static string Country { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Create daily backup ähnelt. + /// Looks up a localized string similar to Create daily backup. /// public static string CreateDailyBackup { get { @@ -2261,7 +2323,7 @@ public static string CreateDailyBackup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credential ähnelt. + /// Looks up a localized string similar to Credential. /// public static string Credential { get { @@ -2270,7 +2332,7 @@ public static string Credential { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credentials ähnelt. + /// Looks up a localized string similar to Credentials. /// public static string Credentials { get { @@ -2279,7 +2341,7 @@ public static string Credentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credential Security Support Provider ähnelt. + /// Looks up a localized string similar to Credential Security Support Provider. /// public static string CredentialSecuritySupportProvider { get { @@ -2288,7 +2350,7 @@ public static string CredentialSecuritySupportProvider { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Crimson ähnelt. + /// Looks up a localized string similar to Crimson. /// public static string Crimson { get { @@ -2297,7 +2359,16 @@ public static string Crimson { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ctrl+Alt+Del ähnelt. + /// Looks up a localized string similar to Ctrl. + /// + public static string Ctrl { + get { + return ResourceManager.GetString("Ctrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ctrl+Alt+Del. /// public static string CtrlAltDel { get { @@ -2306,7 +2377,7 @@ public static string CtrlAltDel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Currency ähnelt. + /// Looks up a localized string similar to Currency. /// public static string Currency { get { @@ -2315,7 +2386,7 @@ public static string Currency { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current download speed ähnelt. + /// Looks up a localized string similar to Current download speed. /// public static string CurrentDownloadSpeed { get { @@ -2324,7 +2395,7 @@ public static string CurrentDownloadSpeed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Currently downloaded ähnelt. + /// Looks up a localized string similar to Currently downloaded. /// public static string CurrentlyDownloaded { get { @@ -2333,7 +2404,7 @@ public static string CurrentlyDownloaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Currently uploaded ähnelt. + /// Looks up a localized string similar to Currently uploaded. /// public static string CurrentlyUploaded { get { @@ -2342,7 +2413,7 @@ public static string CurrentlyUploaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current password ähnelt. + /// Looks up a localized string similar to Current password. /// public static string CurrentPassword { get { @@ -2351,7 +2422,7 @@ public static string CurrentPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Current upload speed ähnelt. + /// Looks up a localized string similar to Current upload speed. /// public static string CurrentUploadSpeed { get { @@ -2360,7 +2431,7 @@ public static string CurrentUploadSpeed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom ähnelt. + /// Looks up a localized string similar to Custom. /// public static string Custom { get { @@ -2369,7 +2440,7 @@ public static string Custom { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom: ähnelt. + /// Looks up a localized string similar to Custom:. /// public static string CustomColon { get { @@ -2378,7 +2449,7 @@ public static string CustomColon { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom commands ähnelt. + /// Looks up a localized string similar to Custom commands. /// public static string CustomCommands { get { @@ -2387,7 +2458,7 @@ public static string CustomCommands { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom screen size: ähnelt. + /// Looks up a localized string similar to Custom screen size:. /// public static string CustomScreenSize { get { @@ -2396,7 +2467,7 @@ public static string CustomScreenSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Custom themes ähnelt. + /// Looks up a localized string similar to Custom themes. /// public static string CustomThemes { get { @@ -2405,7 +2476,7 @@ public static string CustomThemes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cut ähnelt. + /// Looks up a localized string similar to Cut. /// public static string Cut { get { @@ -2414,7 +2485,7 @@ public static string Cut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Cyan ähnelt. + /// Looks up a localized string similar to Cyan. /// public static string Cyan { get { @@ -2423,7 +2494,7 @@ public static string Cyan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dashboard ähnelt. + /// Looks up a localized string similar to Dashboard. /// public static string Dashboard { get { @@ -2432,7 +2503,7 @@ public static string Dashboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Data ähnelt. + /// Looks up a localized string similar to Data. /// public static string Data { get { @@ -2441,7 +2512,7 @@ public static string Data { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Data has been updated! ähnelt. + /// Looks up a localized string similar to Data has been updated!. /// public static string DataHasBeenUpdated { get { @@ -2450,7 +2521,7 @@ public static string DataHasBeenUpdated { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Credentials must be decrypted and loaded to manage them. ähnelt. + /// Looks up a localized string similar to Credentials must be decrypted and loaded to manage them.. /// public static string DecryptAndLoadCredentialsMessage { get { @@ -2459,7 +2530,7 @@ public static string DecryptAndLoadCredentialsMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decrypt and load... ähnelt. + /// Looks up a localized string similar to Decrypt and load.... /// public static string DecryptAndLoadDots { get { @@ -2468,7 +2539,7 @@ public static string DecryptAndLoadDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decryption error ähnelt. + /// Looks up a localized string similar to Decryption error. /// public static string DecryptionError { get { @@ -2477,7 +2548,7 @@ public static string DecryptionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not decrypt file. You may report this issue on GitHub. ähnelt. + /// Looks up a localized string similar to Could not decrypt file. You may report this issue on GitHub.. /// public static string DecryptionErrorMessage { get { @@ -2486,7 +2557,7 @@ public static string DecryptionErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default ähnelt. + /// Looks up a localized string similar to Default. /// public static string Default { get { @@ -2495,7 +2566,7 @@ public static string Default { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default application ähnelt. + /// Looks up a localized string similar to Default application. /// public static string DefaultApplication { get { @@ -2504,7 +2575,7 @@ public static string DefaultApplication { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default-Gateway ähnelt. + /// Looks up a localized string similar to Default-Gateway. /// public static string DefaultGateway { get { @@ -2513,7 +2584,7 @@ public static string DefaultGateway { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default port: ähnelt. + /// Looks up a localized string similar to Default port:. /// public static string DefaultPort { get { @@ -2522,7 +2593,7 @@ public static string DefaultPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default profile ähnelt. + /// Looks up a localized string similar to Default profile. /// public static string DefaultProfile { get { @@ -2531,7 +2602,7 @@ public static string DefaultProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Default region ähnelt. + /// Looks up a localized string similar to Default region. /// public static string DefaultRegion { get { @@ -2540,7 +2611,16 @@ public static string DefaultRegion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete ähnelt. + /// Looks up a localized string similar to Del. + /// + public static string Del { + get { + return ResourceManager.GetString("Del", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete. /// public static string Delete { get { @@ -2549,7 +2629,16 @@ public static string Delete { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete browsing data ähnelt. + /// Looks up a localized string similar to Delete all. + /// + public static string DeleteAll { + get { + return ResourceManager.GetString("DeleteAll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete browsing data. /// public static string DeleteBrowsingData { get { @@ -2558,7 +2647,7 @@ public static string DeleteBrowsingData { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile. ähnelt. + /// Looks up a localized string similar to Permanently delete browsing data (history, cookies, cache, credentials, etc.) for the current WebView2 profile.. /// public static string DeleteBrowsingDataMessage { get { @@ -2567,7 +2656,7 @@ public static string DeleteBrowsingDataMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected credential will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected credential will be deleted permanently.. /// public static string DeleteCredentialMessage { get { @@ -2576,7 +2665,7 @@ public static string DeleteCredentialMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete credentials ähnelt. + /// Looks up a localized string similar to Delete credentials. /// public static string DeleteCredentials { get { @@ -2585,7 +2674,7 @@ public static string DeleteCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete custom command ähnelt. + /// Looks up a localized string similar to Delete custom command. /// public static string DeleteCustomCommand { get { @@ -2594,7 +2683,7 @@ public static string DeleteCustomCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected custom command will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected custom command will be deleted permanently.. /// public static string DeleteCustomCommandMessage { get { @@ -2603,7 +2692,7 @@ public static string DeleteCustomCommandMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete DNS server ähnelt. + /// Looks up a localized string similar to Delete DNS server. /// public static string DeleteDNSServer { get { @@ -2612,7 +2701,7 @@ public static string DeleteDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected DNS server will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected DNS server will be deleted permanently.. /// public static string DeleteDNSServerMessage { get { @@ -2621,7 +2710,7 @@ public static string DeleteDNSServerMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete... ähnelt. + /// Looks up a localized string similar to Delete.... /// public static string DeleteDots { get { @@ -2630,7 +2719,7 @@ public static string DeleteDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete entry ähnelt. + /// Looks up a localized string similar to Delete entry. /// public static string DeleteEntry { get { @@ -2639,7 +2728,7 @@ public static string DeleteEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete group ähnelt. + /// Looks up a localized string similar to Delete group. /// public static string DeleteGroup { get { @@ -2648,7 +2737,7 @@ public static string DeleteGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected group and all profiles inside this group will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected group and all profiles inside this group will be deleted permanently.. /// public static string DeleteGroupMessage { get { @@ -2657,9 +2746,9 @@ public static string DeleteGroupMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected entry is permanently deleted: + /// Looks up a localized string similar to The selected entry is permanently deleted: /// - ///{0} {1} {2} ähnelt. + ///{0} {1} {2}. /// public static string DeleteHostsFileEntryMessage { get { @@ -2668,7 +2757,7 @@ public static string DeleteHostsFileEntryMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete OID profile ähnelt. + /// Looks up a localized string similar to Delete OID profile. /// public static string DeleteOIDProfile { get { @@ -2677,7 +2766,7 @@ public static string DeleteOIDProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected OID profile will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected OID profile will be deleted permanently.. /// public static string DeleteOIDProfileMessage { get { @@ -2686,7 +2775,7 @@ public static string DeleteOIDProfileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete port profile ähnelt. + /// Looks up a localized string similar to Delete port profile. /// public static string DeletePortProfile { get { @@ -2695,7 +2784,7 @@ public static string DeletePortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected port profile will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected port profile will be deleted permanently.. /// public static string DeletePortProfileMessage { get { @@ -2704,7 +2793,7 @@ public static string DeletePortProfileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profile ähnelt. + /// Looks up a localized string similar to Delete profile. /// public static string DeleteProfile { get { @@ -2713,7 +2802,7 @@ public static string DeleteProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profile file ähnelt. + /// Looks up a localized string similar to Delete profile file. /// public static string DeleteProfileFile { get { @@ -2722,7 +2811,7 @@ public static string DeleteProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile file "{0}" will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Profile file "{0}" will be deleted permanently.. /// public static string DeleteProfileFileXMessage { get { @@ -2731,7 +2820,7 @@ public static string DeleteProfileFileXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected profile will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected profile will be deleted permanently.. /// public static string DeleteProfileMessage { get { @@ -2740,7 +2829,7 @@ public static string DeleteProfileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete profiles ähnelt. + /// Looks up a localized string similar to Delete profiles. /// public static string DeleteProfiles { get { @@ -2749,7 +2838,7 @@ public static string DeleteProfiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected profiles will be deleted permanently. ähnelt. + /// Looks up a localized string similar to Selected profiles will be deleted permanently.. /// public static string DeleteProfilesMessage { get { @@ -2758,7 +2847,7 @@ public static string DeleteProfilesMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete SNTP server ähnelt. + /// Looks up a localized string similar to Delete SNTP server. /// public static string DeleteSNTPServer { get { @@ -2767,7 +2856,7 @@ public static string DeleteSNTPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The selected SNTP server will be deleted permanently. ähnelt. + /// Looks up a localized string similar to The selected SNTP server will be deleted permanently.. /// public static string DeleteSNTPServerMessage { get { @@ -2776,7 +2865,7 @@ public static string DeleteSNTPServerMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delete table ähnelt. + /// Looks up a localized string similar to Delete table. /// public static string DeleteTable { get { @@ -2785,7 +2874,7 @@ public static string DeleteTable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Description ähnelt. + /// Looks up a localized string similar to Description. /// public static string Description { get { @@ -2794,7 +2883,16 @@ public static string Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Design ähnelt. + /// Looks up a localized string similar to Deselect. + /// + public static string Deselect { + get { + return ResourceManager.GetString("Deselect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Design. /// public static string Design { get { @@ -2803,7 +2901,7 @@ public static string Design { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Desktop background ähnelt. + /// Looks up a localized string similar to Desktop background. /// public static string DesktopBackground { get { @@ -2812,7 +2910,7 @@ public static string DesktopBackground { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Desktop composition ähnelt. + /// Looks up a localized string similar to Desktop composition. /// public static string DesktopComposition { get { @@ -2821,7 +2919,7 @@ public static string DesktopComposition { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination ähnelt. + /// Looks up a localized string similar to Destination. /// public static string Destination { get { @@ -2830,7 +2928,7 @@ public static string Destination { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt. + /// Looks up a localized string similar to Details. /// public static string Details { get { @@ -2839,7 +2937,7 @@ public static string Details { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detecting network... ähnelt. + /// Looks up a localized string similar to Detecting network.... /// public static string DetectingNetworkDots { get { @@ -2848,7 +2946,7 @@ public static string DetectingNetworkDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detect local ip address and subnetmask ähnelt. + /// Looks up a localized string similar to Detect local ip address and subnetmask. /// public static string DetectLocalIPAddressAndSubnetmask { get { @@ -2857,7 +2955,7 @@ public static string DetectLocalIPAddressAndSubnetmask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Developed and maintained by {0} with the help of the ähnelt. + /// Looks up a localized string similar to Developed and maintained by {0} with the help of the. /// public static string DevelopedAndMaintainedByX { get { @@ -2866,7 +2964,7 @@ public static string DevelopedAndMaintainedByX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Device ähnelt. + /// Looks up a localized string similar to Device. /// public static string Device { get { @@ -2875,7 +2973,7 @@ public static string Device { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Device description ähnelt. + /// Looks up a localized string similar to Device description. /// public static string DeviceDescription { get { @@ -2884,7 +2982,7 @@ public static string DeviceDescription { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP enabled ähnelt. + /// Looks up a localized string similar to DHCP enabled. /// public static string DHCPEnabled { get { @@ -2893,7 +2991,7 @@ public static string DHCPEnabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP lease expires ähnelt. + /// Looks up a localized string similar to DHCP lease expires. /// public static string DHCPLeaseExpires { get { @@ -2902,7 +3000,7 @@ public static string DHCPLeaseExpires { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP lease obtained ähnelt. + /// Looks up a localized string similar to DHCP lease obtained. /// public static string DHCPLeaseObtained { get { @@ -2911,7 +3009,7 @@ public static string DHCPLeaseObtained { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DHCP server ähnelt. + /// Looks up a localized string similar to DHCP server. /// public static string DHCPServer { get { @@ -2920,7 +3018,16 @@ public static string DHCPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disable ähnelt. + /// Looks up a localized string similar to Direction. + /// + public static string Direction { + get { + return ResourceManager.GetString("Direction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable. /// public static string Disable { get { @@ -2929,7 +3036,7 @@ public static string Disable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disable encryption... ähnelt. + /// Looks up a localized string similar to Disable encryption.... /// public static string DisableEncryptionDots { get { @@ -2938,7 +3045,7 @@ public static string DisableEncryptionDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disable entry ähnelt. + /// Looks up a localized string similar to Disable entry. /// public static string DisableEntry { get { @@ -2947,7 +3054,7 @@ public static string DisableEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disclaimer ähnelt. + /// Looks up a localized string similar to Disclaimer. /// public static string Disclaimer { get { @@ -2956,7 +3063,7 @@ public static string Disclaimer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disconnect ähnelt. + /// Looks up a localized string similar to Disconnect. /// public static string Disconnect { get { @@ -2965,7 +3072,7 @@ public static string Disconnect { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Disconnected ähnelt. + /// Looks up a localized string similar to Disconnected. /// public static string Disconnected { get { @@ -2974,7 +3081,7 @@ public static string Disconnected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Discovery Protocol ähnelt. + /// Looks up a localized string similar to Discovery Protocol. /// public static string DiscoveryProtocol { get { @@ -2983,7 +3090,7 @@ public static string DiscoveryProtocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CDP ähnelt. + /// Looks up a localized string similar to CDP. /// public static string DiscoveryProtocol_Cdp { get { @@ -2992,7 +3099,7 @@ public static string DiscoveryProtocol_Cdp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP ähnelt. + /// Looks up a localized string similar to LLDP. /// public static string DiscoveryProtocol_Lldp { get { @@ -3001,7 +3108,7 @@ public static string DiscoveryProtocol_Lldp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP / CDP ähnelt. + /// Looks up a localized string similar to LLDP / CDP. /// public static string DiscoveryProtocol_LldpCdp { get { @@ -3010,7 +3117,7 @@ public static string DiscoveryProtocol_LldpCdp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Display ähnelt. + /// Looks up a localized string similar to Display. /// public static string Display { get { @@ -3019,7 +3126,7 @@ public static string Display { } /// - /// Sucht eine lokalisierte Zeichenfolge, die District ähnelt. + /// Looks up a localized string similar to District. /// public static string District { get { @@ -3028,7 +3135,7 @@ public static string District { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS ähnelt. + /// Looks up a localized string similar to DNS. /// public static string DNS { get { @@ -3037,7 +3144,7 @@ public static string DNS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS autconfiguration ähnelt. + /// Looks up a localized string similar to DNS autconfiguration. /// public static string DNSAutoconfiguration { get { @@ -3046,7 +3153,7 @@ public static string DNSAutoconfiguration { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup ähnelt. + /// Looks up a localized string similar to DNS Lookup. /// public static string DNSLookup { get { @@ -3055,7 +3162,7 @@ public static string DNSLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS Lookup... ähnelt. + /// Looks up a localized string similar to DNS Lookup.... /// public static string DNSLookupDots { get { @@ -3064,7 +3171,7 @@ public static string DNSLookupDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS resolver ähnelt. + /// Looks up a localized string similar to DNS resolver. /// public static string DNSResolver { get { @@ -3073,7 +3180,7 @@ public static string DNSResolver { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS server ähnelt. + /// Looks up a localized string similar to DNS server. /// public static string DNSServer { get { @@ -3082,7 +3189,7 @@ public static string DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS server(s) ähnelt. + /// Looks up a localized string similar to DNS server(s). /// public static string DNSServers { get { @@ -3091,7 +3198,7 @@ public static string DNSServers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A DNS server with this name already exists! ähnelt. + /// Looks up a localized string similar to A DNS server with this name already exists!. /// public static string DNSServerWithThisNameAlreadyExists { get { @@ -3100,7 +3207,7 @@ public static string DNSServerWithThisNameAlreadyExists { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS suffix ähnelt. + /// Looks up a localized string similar to DNS suffix. /// public static string DNSSuffix { get { @@ -3109,7 +3216,7 @@ public static string DNSSuffix { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Domain ähnelt. + /// Looks up a localized string similar to Domain. /// public static string Domain { get { @@ -3118,7 +3225,16 @@ public static string Domain { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Domain name ähnelt. + /// Looks up a localized string similar to Dom. + /// + public static string Domain_Short3 { + get { + return ResourceManager.GetString("Domain_Short3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Domain name. /// public static string DomainName { get { @@ -3127,7 +3243,7 @@ public static string DomainName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Donate ähnelt. + /// Looks up a localized string similar to Donate. /// public static string Donate { get { @@ -3136,7 +3252,7 @@ public static string Donate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Don't fragment ähnelt. + /// Looks up a localized string similar to Don't fragment. /// public static string DontFragment { get { @@ -3145,7 +3261,7 @@ public static string DontFragment { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Download ähnelt. + /// Looks up a localized string similar to Download. /// public static string Download { get { @@ -3154,7 +3270,7 @@ public static string Download { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Download Microsoft Edge WebView2 Runtime ähnelt. + /// Looks up a localized string similar to Download Microsoft Edge WebView2 Runtime. /// public static string DownloadMicrosoftEdgeWebView2Runtime { get { @@ -3163,8 +3279,8 @@ public static string DownloadMicrosoftEdgeWebView2Runtime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Drag and drop the applications to reorder them. - ///Right-click for more options. ähnelt. + /// Looks up a localized string similar to Drag and drop the applications to reorder them. + ///Right-click for more options.. /// public static string DragDropApplicationsToReorderRightClickForMoreOptions { get { @@ -3173,7 +3289,7 @@ public static string DragDropApplicationsToReorderRightClickForMoreOptions { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Duration ähnelt. + /// Looks up a localized string similar to Duration. /// public static string Duration { get { @@ -3182,7 +3298,7 @@ public static string Duration { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Duration (s) ähnelt. + /// Looks up a localized string similar to Duration (s). /// public static string DurationS { get { @@ -3191,7 +3307,7 @@ public static string DurationS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dynamic IPv4 address ähnelt. + /// Looks up a localized string similar to Dynamic IPv4 address. /// public static string DynamicIPv4Address { get { @@ -3200,7 +3316,7 @@ public static string DynamicIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dynamic IPv4 DNS server ähnelt. + /// Looks up a localized string similar to Dynamic IPv4 DNS server. /// public static string DynamicIPv4DNSServer { get { @@ -3209,7 +3325,7 @@ public static string DynamicIPv4DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit credentials ähnelt. + /// Looks up a localized string similar to Edit credentials. /// public static string EditCredentials { get { @@ -3218,7 +3334,7 @@ public static string EditCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit custom command ähnelt. + /// Looks up a localized string similar to Edit custom command. /// public static string EditCustomCommand { get { @@ -3227,7 +3343,7 @@ public static string EditCustomCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit DNS server ähnelt. + /// Looks up a localized string similar to Edit DNS server. /// public static string EditDNSServer { get { @@ -3236,7 +3352,7 @@ public static string EditDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit... ähnelt. + /// Looks up a localized string similar to Edit.... /// public static string EditDots { get { @@ -3245,7 +3361,7 @@ public static string EditDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit entry ähnelt. + /// Looks up a localized string similar to Edit entry. /// public static string EditEntry { get { @@ -3254,7 +3370,7 @@ public static string EditEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit entry... ähnelt. + /// Looks up a localized string similar to Edit entry.... /// public static string EditEntryDots { get { @@ -3263,7 +3379,7 @@ public static string EditEntryDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit group ähnelt. + /// Looks up a localized string similar to Edit group. /// public static string EditGroup { get { @@ -3272,7 +3388,7 @@ public static string EditGroup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit group... ähnelt. + /// Looks up a localized string similar to Edit group.... /// public static string EditGroupDots { get { @@ -3281,7 +3397,7 @@ public static string EditGroupDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit OID profile ähnelt. + /// Looks up a localized string similar to Edit OID profile. /// public static string EditOIDProfile { get { @@ -3290,7 +3406,7 @@ public static string EditOIDProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit port profile ähnelt. + /// Looks up a localized string similar to Edit port profile. /// public static string EditPortProfile { get { @@ -3299,7 +3415,7 @@ public static string EditPortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit profile ähnelt. + /// Looks up a localized string similar to Edit profile. /// public static string EditProfile { get { @@ -3308,7 +3424,7 @@ public static string EditProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit profile file ähnelt. + /// Looks up a localized string similar to Edit profile file. /// public static string EditProfileFile { get { @@ -3317,7 +3433,7 @@ public static string EditProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Edit SNTP server ähnelt. + /// Looks up a localized string similar to Edit SNTP server. /// public static string EditSNTPServer { get { @@ -3326,7 +3442,7 @@ public static string EditSNTPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die EDNS ähnelt. + /// Looks up a localized string similar to EDNS. /// public static string EDNS { get { @@ -3335,7 +3451,7 @@ public static string EDNS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Emerald ähnelt. + /// Looks up a localized string similar to Emerald. /// public static string Emerald { get { @@ -3344,7 +3460,7 @@ public static string Emerald { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable ähnelt. + /// Looks up a localized string similar to Enable. /// public static string Enable { get { @@ -3353,7 +3469,7 @@ public static string Enable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable Credential Security Support Provider ähnelt. + /// Looks up a localized string similar to Enable Credential Security Support Provider. /// public static string EnableCredentialSecuritySupportProvider { get { @@ -3362,7 +3478,7 @@ public static string EnableCredentialSecuritySupportProvider { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enabled ähnelt. + /// Looks up a localized string similar to Enabled. /// public static string Enabled { get { @@ -3371,7 +3487,7 @@ public static string Enabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable encryption... ähnelt. + /// Looks up a localized string similar to Enable encryption.... /// public static string EnableEncryptionDots { get { @@ -3380,10 +3496,10 @@ public static string EnableEncryptionDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? + /// Looks up a localized string similar to Do you want to enable profile file encryption to protect sensitive data such as hosts, IP addresses, URLs, and stored credentials? /// ///You can enable or disable encryption later at any time by right-clicking the profile file to manage encryption settings. - ///If you click Cancel, the profile file will remain unencrypted. ähnelt. + ///If you click Cancel, the profile file will remain unencrypted.. /// public static string EnableEncryptionForProfileFileMessage { get { @@ -3392,7 +3508,7 @@ public static string EnableEncryptionForProfileFileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable encryption? ähnelt. + /// Looks up a localized string similar to Enable encryption?. /// public static string EnableEncryptionQuestion { get { @@ -3401,7 +3517,7 @@ public static string EnableEncryptionQuestion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable entry ähnelt. + /// Looks up a localized string similar to Enable entry. /// public static string EnableEntry { get { @@ -3410,7 +3526,7 @@ public static string EnableEntry { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable gateway server ähnelt. + /// Looks up a localized string similar to Enable gateway server. /// public static string EnableGatewayServer { get { @@ -3419,7 +3535,7 @@ public static string EnableGatewayServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable log ähnelt. + /// Looks up a localized string similar to Enable log. /// public static string EnableLog { get { @@ -3428,7 +3544,7 @@ public static string EnableLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption ähnelt. + /// Looks up a localized string similar to Encryption. /// public static string Encryption { get { @@ -3437,7 +3553,7 @@ public static string Encryption { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption... ähnelt. + /// Looks up a localized string similar to Encryption.... /// public static string EncryptionDots { get { @@ -3446,7 +3562,7 @@ public static string EncryptionDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption error ähnelt. + /// Looks up a localized string similar to Encryption error. /// public static string EncryptionError { get { @@ -3455,7 +3571,7 @@ public static string EncryptionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not encrpyt file. You may report this issue on GitHub. ähnelt. + /// Looks up a localized string similar to Could not encrpyt file. You may report this issue on GitHub.. /// public static string EncryptionErrorMessage { get { @@ -3464,7 +3580,7 @@ public static string EncryptionErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die End time ähnelt. + /// Looks up a localized string similar to End time. /// public static string EndTime { get { @@ -3473,7 +3589,7 @@ public static string EndTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a domain to query whois... ähnelt. + /// Looks up a localized string similar to Enter a domain to query whois.... /// public static string EnterADomainToQueryWhoisDots { get { @@ -3482,7 +3598,7 @@ public static string EnterADomainToQueryWhoisDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a number and select a unit to calculate the units... ähnelt. + /// Looks up a localized string similar to Enter a number and select a unit to calculate the units.... /// public static string EnterANumberAndSelectAUnitToCalculateTheUnitsDots { get { @@ -3491,7 +3607,7 @@ public static string EnterANumberAndSelectAUnitToCalculateTheUnitsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a subnet to calculate it... ähnelt. + /// Looks up a localized string similar to Enter a subnet to calculate it.... /// public static string EnterASubnetToCalculateItDots { get { @@ -3500,7 +3616,7 @@ public static string EnterASubnetToCalculateItDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter host to query IP geolocation... ähnelt. + /// Looks up a localized string similar to Enter host to query IP geolocation.... /// public static string EnterHostToQueryIPGeolocationDots { get { @@ -3509,7 +3625,16 @@ public static string EnterHostToQueryIPGeolocationDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter location... ähnelt. + /// Looks up a localized string similar to Enter less than 10001 ports or port ranges. + /// + public static string EnterLessThan10001PortsOrPortRanges { + get { + return ResourceManager.GetString("EnterLessThan10001PortsOrPortRanges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter location.... /// public static string EnterLocationDots { get { @@ -3518,7 +3643,7 @@ public static string EnterLocationDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter master password to unlock the profile file: ähnelt. + /// Looks up a localized string similar to Enter master password to unlock the profile file:. /// public static string EnterMasterPasswordToUnlockProfile { get { @@ -3527,7 +3652,7 @@ public static string EnterMasterPasswordToUnlockProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter one or more valid IP addresses! ähnelt. + /// Looks up a localized string similar to Enter one or more valid IP addresses!. /// public static string EnterOneOrMoreValidIPAddresses { get { @@ -3536,7 +3661,7 @@ public static string EnterOneOrMoreValidIPAddresses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter password... ähnelt. + /// Looks up a localized string similar to Enter password.... /// public static string EnterPasswordDots { get { @@ -3545,7 +3670,25 @@ public static string EnterPasswordDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter subnet and a new subnet mask to create subnets... ähnelt. + /// Looks up a localized string similar to Enter path to *.exe file.. + /// + public static string EnterPathToExe { + get { + return ResourceManager.GetString("EnterPathToExe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter positive integer!. + /// + public static string EnterPositiveInteger { + get { + return ResourceManager.GetString("EnterPositiveInteger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter subnet and a new subnet mask to create subnets.... /// public static string EnterSubnetAndANewSubnetmaskToCreateSubnets { get { @@ -3554,7 +3697,7 @@ public static string EnterSubnetAndANewSubnetmaskToCreateSubnets { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter subnets to create a wide subnet... ähnelt. + /// Looks up a localized string similar to Enter subnets to create a wide subnet.... /// public static string EnterSubnetsToCreateAWideSubnet { get { @@ -3563,7 +3706,7 @@ public static string EnterSubnetsToCreateAWideSubnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid baud! ähnelt. + /// Looks up a localized string similar to Enter a valid baud!. /// public static string EnterValidBaud { get { @@ -3572,7 +3715,7 @@ public static string EnterValidBaud { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid domain (e.g., "example.com")! ähnelt. + /// Looks up a localized string similar to Enter a valid domain (e.g., "example.com")!. /// public static string EnterValidDomain { get { @@ -3581,7 +3724,7 @@ public static string EnterValidDomain { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid file name! ähnelt. + /// Looks up a localized string similar to Enter a valid file name!. /// public static string EnterValidFileName { get { @@ -3590,7 +3733,7 @@ public static string EnterValidFileName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid file path! ähnelt. + /// Looks up a localized string similar to Enter a valid file path!. /// public static string EnterValidFilePath { get { @@ -3599,7 +3742,7 @@ public static string EnterValidFilePath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid folder path! ähnelt. + /// Looks up a localized string similar to Enter a valid folder path!. /// public static string EnterValidFolderPath { get { @@ -3608,7 +3751,7 @@ public static string EnterValidFolderPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname! ähnelt. + /// Looks up a localized string similar to Enter a valid hostname!. /// public static string EnterValidHostname { get { @@ -3617,7 +3760,7 @@ public static string EnterValidHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname and port! ähnelt. + /// Looks up a localized string similar to Enter a valid hostname and port!. /// public static string EnterValidHostnameAndPort { get { @@ -3626,7 +3769,7 @@ public static string EnterValidHostnameAndPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)! ähnelt. + /// Looks up a localized string similar to Enter a valid hostname (e.g., "server-01" or "example.com") or a valid IP address (e.g., 192.168.178.1)!. /// public static string EnterValidHostnameOrIPAddress { get { @@ -3635,7 +3778,7 @@ public static string EnterValidHostnameOrIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter valid hosts (multiple hosts can not end with ";")! ähnelt. + /// Looks up a localized string similar to Enter valid hosts (multiple hosts can not end with ";")!. /// public static string EnterValidHosts { get { @@ -3644,7 +3787,7 @@ public static string EnterValidHosts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space. ähnelt. + /// Looks up a localized string similar to Enter a valid hostname (e.g., "server-01" or "example.com")! Multiple hostnames can be separated with a space.. /// public static string EnterValidHostsFileEntryHostname { get { @@ -3653,7 +3796,7 @@ public static string EnterValidHostsFileEntryHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IP address! ähnelt. + /// Looks up a localized string similar to Enter a valid IP address!. /// public static string EnterValidIPAddress { get { @@ -3662,7 +3805,7 @@ public static string EnterValidIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IP range! ähnelt. + /// Looks up a localized string similar to Enter a valid IP range!. /// public static string EnterValidIPScanRange { get { @@ -3671,7 +3814,7 @@ public static string EnterValidIPScanRange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IPv4 address! ähnelt. + /// Looks up a localized string similar to Enter a valid IPv4 address!. /// public static string EnterValidIPv4Address { get { @@ -3680,7 +3823,7 @@ public static string EnterValidIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid IPv6 address! ähnelt. + /// Looks up a localized string similar to Enter a valid IPv6 address!. /// public static string EnterValidIPv6Address { get { @@ -3689,7 +3832,7 @@ public static string EnterValidIPv6Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)! ähnelt. + /// Looks up a localized string similar to Enter a valid MAC address (e.g., 00:F1:23:AB:F2:35)!. /// public static string EnterValidMACAddress { get { @@ -3698,7 +3841,7 @@ public static string EnterValidMACAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid number! ähnelt. + /// Looks up a localized string similar to Enter a valid number!. /// public static string EnterValidNumber { get { @@ -3707,7 +3850,7 @@ public static string EnterValidNumber { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid OID! ähnelt. + /// Looks up a localized string similar to Enter a valid OID!. /// public static string EnterValidOID { get { @@ -3716,7 +3859,7 @@ public static string EnterValidOID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid port (1 - 65535)! ähnelt. + /// Looks up a localized string similar to Enter a valid port (1 - 65535)!. /// public static string EnterValidPort { get { @@ -3725,7 +3868,7 @@ public static string EnterValidPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid port and/or port range (1 - 65535)! ähnelt. + /// Looks up a localized string similar to Enter a valid port and/or port range (1 - 65535)!. /// public static string EnterValidPortOrPortRange { get { @@ -3734,7 +3877,7 @@ public static string EnterValidPortOrPortRange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnet (e.g., 192.168.178.133/26)! ähnelt. + /// Looks up a localized string similar to Enter a valid subnet (e.g., 192.168.178.133/26)!. /// public static string EnterValidSubnet { get { @@ -3743,7 +3886,7 @@ public static string EnterValidSubnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnetmask (e.g., 255.255.255.0)! ähnelt. + /// Looks up a localized string similar to Enter a valid subnetmask (e.g., 255.255.255.0)!. /// public static string EnterValidSubnetmask { get { @@ -3752,7 +3895,7 @@ public static string EnterValidSubnetmask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)! ähnelt. + /// Looks up a localized string similar to Enter a valid subnetmask or CIDR (e.g., 255.255.255.0 or /24)!. /// public static string EnterValidSubnetmaskOrCIDR { get { @@ -3761,7 +3904,7 @@ public static string EnterValidSubnetmaskOrCIDR { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enter a valid website (e.g., https://example.com/index.html) ähnelt. + /// Looks up a localized string similar to Enter a valid website (e.g., https://example.com/index.html). /// public static string EnterValidWebsiteUri { get { @@ -3770,7 +3913,7 @@ public static string EnterValidWebsiteUri { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Entries ähnelt. + /// Looks up a localized string similar to Entries. /// public static string Entries { get { @@ -3779,7 +3922,34 @@ public static string Entries { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error ähnelt. + /// Looks up a localized string similar to Erase the local port history. + /// + public static string EraseLocalPortHistory { + get { + return ResourceManager.GetString("EraseLocalPortHistory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Erase port history. + /// + public static string ErasePortHistory { + get { + return ResourceManager.GetString("ErasePortHistory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Erase the remote port history. + /// + public static string EraseRemotePortHistory { + get { + return ResourceManager.GetString("EraseRemotePortHistory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error. /// public static string Error { get { @@ -3788,7 +3958,7 @@ public static string Error { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Couldn't connect to 'api.github.com', check your network connection! ähnelt. + /// Looks up a localized string similar to Couldn't connect to 'api.github.com', check your network connection!. /// public static string ErrorCheckingApiGithubComVerifyYourNetworkConnection { get { @@ -3797,7 +3967,7 @@ public static string ErrorCheckingApiGithubComVerifyYourNetworkConnection { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error in response! ähnelt. + /// Looks up a localized string similar to Error in response!. /// public static string ErrorInResponse { get { @@ -3806,7 +3976,7 @@ public static string ErrorInResponse { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error in response! Check if you have write permissions. ähnelt. + /// Looks up a localized string similar to Error in response! Check if you have write permissions.. /// public static string ErrorInResponseCheckIfYouHaveWritePermissions { get { @@ -3815,7 +3985,7 @@ public static string ErrorInResponseCheckIfYouHaveWritePermissions { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The name is already used! ähnelt. + /// Looks up a localized string similar to The name is already used!. /// public static string ErrorMessage_NameIsAlreadyUsed { get { @@ -3824,7 +3994,7 @@ public static string ErrorMessage_NameIsAlreadyUsed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings on this page contain errors. Correct them to be able to save. ähnelt. + /// Looks up a localized string similar to The settings on this page contain errors. Correct them to be able to save.. /// public static string ErrorMessage_TabPageHasError { get { @@ -3833,7 +4003,7 @@ public static string ErrorMessage_TabPageHasError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Error while scanning WiFi adapter "{0}" with error: "{1}" ähnelt. + /// Looks up a localized string similar to Error while scanning WiFi adapter "{0}" with error: "{1}". /// public static string ErrorWhileScanningWiFiAdapterXXXWithErrorXXX { get { @@ -3842,7 +4012,7 @@ public static string ErrorWhileScanningWiFiAdapterXXXWithErrorXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Everything ähnelt. + /// Looks up a localized string similar to Everything. /// public static string Everything { get { @@ -3851,7 +4021,7 @@ public static string Everything { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Linux servers running in AWS... ähnelt. + /// Looks up a localized string similar to Linux servers running in AWS.... /// public static string ExampleGroupDescription { get { @@ -3860,7 +4030,7 @@ public static string ExampleGroupDescription { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Primary DNS server ähnelt. + /// Looks up a localized string similar to Primary DNS server. /// public static string ExampleHostsFileEntryComment { get { @@ -3869,7 +4039,7 @@ public static string ExampleHostsFileEntryComment { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ubuntu Server running Docker with Nextcloud and Traefik... ähnelt. + /// Looks up a localized string similar to Ubuntu Server running Docker with Nextcloud and Traefik.... /// public static string ExampleProfileDescription { get { @@ -3878,7 +4048,7 @@ public static string ExampleProfileDescription { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Customer 1 ähnelt. + /// Looks up a localized string similar to Customer 1. /// public static string ExampleProfileFileName { get { @@ -3887,7 +4057,7 @@ public static string ExampleProfileFileName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die production ähnelt. + /// Looks up a localized string similar to production. /// public static string ExampleTag { get { @@ -3896,7 +4066,7 @@ public static string ExampleTag { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Execution Policy ähnelt. + /// Looks up a localized string similar to Execution Policy. /// public static string ExecutionPolicy { get { @@ -3905,7 +4075,7 @@ public static string ExecutionPolicy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Expand ähnelt. + /// Looks up a localized string similar to Expand. /// public static string Expand { get { @@ -3914,7 +4084,7 @@ public static string Expand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Expand all ähnelt. + /// Looks up a localized string similar to Expand all. /// public static string ExpandAll { get { @@ -3923,7 +4093,7 @@ public static string ExpandAll { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Expand and open search... ähnelt. + /// Looks up a localized string similar to Expand and open search.... /// public static string ExpandAndOpenSearchDots { get { @@ -3932,7 +4102,7 @@ public static string ExpandAndOpenSearchDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Expand host view ähnelt. + /// Looks up a localized string similar to Expand host view. /// public static string ExpandHostView { get { @@ -3941,7 +4111,7 @@ public static string ExpandHostView { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Experience ähnelt. + /// Looks up a localized string similar to Experience. /// public static string Experience { get { @@ -3950,7 +4120,7 @@ public static string Experience { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Experimental ähnelt. + /// Looks up a localized string similar to Experimental. /// public static string Experimental { get { @@ -3959,7 +4129,7 @@ public static string Experimental { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Experimental features ähnelt. + /// Looks up a localized string similar to Experimental features. /// public static string ExperimentalFeatures { get { @@ -3968,7 +4138,7 @@ public static string ExperimentalFeatures { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export ähnelt. + /// Looks up a localized string similar to Export. /// public static string Export { get { @@ -3977,7 +4147,7 @@ public static string Export { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export all ähnelt. + /// Looks up a localized string similar to Export all. /// public static string ExportAll { get { @@ -3986,7 +4156,7 @@ public static string ExportAll { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export... ähnelt. + /// Looks up a localized string similar to Export.... /// public static string ExportDots { get { @@ -3995,7 +4165,7 @@ public static string ExportDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Export selected ähnelt. + /// Looks up a localized string similar to Export selected. /// public static string ExportSelected { get { @@ -4004,7 +4174,7 @@ public static string ExportSelected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Geolocation API - Fast, accurate, reliable ähnelt. + /// Looks up a localized string similar to IP Geolocation API - Fast, accurate, reliable. /// public static string ExternalService_ip_api_Description { get { @@ -4013,7 +4183,7 @@ public static string ExternalService_ip_api_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A Simple Public IP Address API ähnelt. + /// Looks up a localized string similar to A Simple Public IP Address API. /// public static string ExternalService_ipify_Description { get { @@ -4022,7 +4192,7 @@ public static string ExternalService_ipify_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die External services ähnelt. + /// Looks up a localized string similar to External services. /// public static string ExternalServices { get { @@ -4031,7 +4201,7 @@ public static string ExternalServices { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Failed to load hosts file: {0} ähnelt. + /// Looks up a localized string similar to Failed to load hosts file: {0}. /// public static string FailedToLoadHostsFileMessage { get { @@ -4040,7 +4210,7 @@ public static string FailedToLoadHostsFileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Field cannot be empty! ähnelt. + /// Looks up a localized string similar to Field cannot be empty!. /// public static string FieldCannotBeEmpty { get { @@ -4049,7 +4219,7 @@ public static string FieldCannotBeEmpty { } /// - /// Sucht eine lokalisierte Zeichenfolge, die File ähnelt. + /// Looks up a localized string similar to File. /// public static string File { get { @@ -4058,7 +4228,7 @@ public static string File { } /// - /// Sucht eine lokalisierte Zeichenfolge, die File does not exists! ähnelt. + /// Looks up a localized string similar to File does not exists!. /// public static string FileDoesNotExist { get { @@ -4067,7 +4237,7 @@ public static string FileDoesNotExist { } /// - /// Sucht eine lokalisierte Zeichenfolge, die File exported to "{0}"! ähnelt. + /// Looks up a localized string similar to File exported to "{0}"!. /// public static string FileExportedToXX { get { @@ -4076,7 +4246,7 @@ public static string FileExportedToXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die File path ähnelt. + /// Looks up a localized string similar to File path. /// public static string FilePath { get { @@ -4085,7 +4255,7 @@ public static string FilePath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter ähnelt. + /// Looks up a localized string similar to Filter. /// public static string Filter { get { @@ -4094,7 +4264,7 @@ public static string Filter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter by tags ähnelt. + /// Looks up a localized string similar to Filter by tags. /// public static string FilterByTags { get { @@ -4103,7 +4273,7 @@ public static string FilterByTags { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter... ähnelt. + /// Looks up a localized string similar to Filter.... /// public static string FilterDots { get { @@ -4112,7 +4282,7 @@ public static string FilterDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Filter profiles... ähnelt. + /// Looks up a localized string similar to Filter profiles.... /// public static string FilterProfilesDots { get { @@ -4121,7 +4291,79 @@ public static string FilterProfilesDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die First usable IP address ähnelt. + /// Looks up a localized string similar to Firewall. + /// + public static string Firewall { + get { + return ResourceManager.GetString("Firewall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add firewall rule. + /// + public static string Firewall_ToolTip_Add { + get { + return ResourceManager.GetString("Firewall_ToolTip_Add", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Apply firewall rules. + /// + public static string Firewall_ToolTip_Apply { + get { + return ResourceManager.GetString("Firewall_ToolTip_Apply", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear all firewall rules. + /// + public static string Firewall_ToolTip_Clear { + get { + return ResourceManager.GetString("Firewall_ToolTip_Clear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear NETworkManager rules in Windows firewall. + /// + public static string Firewall_ToolTip_ClearWindows { + get { + return ResourceManager.GetString("Firewall_ToolTip_ClearWindows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete selected or last firewall rule. + /// + public static string Firewall_ToolTip_Delete { + get { + return ResourceManager.GetString("Firewall_ToolTip_Delete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Windows firewall settings. + /// + public static string Firewall_ToolTip_OpenWindowsFirewall { + get { + return ResourceManager.GetString("Firewall_ToolTip_OpenWindowsFirewall", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firewall rules. + /// + public static string FirewallRules { + get { + return ResourceManager.GetString("FirewallRules", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First usable IP address. /// public static string FirstUsableIPAddress { get { @@ -4130,7 +4372,7 @@ public static string FirstUsableIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Fixed screen size: ähnelt. + /// Looks up a localized string similar to Fixed screen size:. /// public static string FixedScreenSize { get { @@ -4139,7 +4381,7 @@ public static string FixedScreenSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Flush DNS cache ähnelt. + /// Looks up a localized string similar to Flush DNS cache. /// public static string FlushDNSCache { get { @@ -4148,7 +4390,7 @@ public static string FlushDNSCache { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Folder does not exists! ähnelt. + /// Looks up a localized string similar to Folder does not exists!. /// public static string FolderDoesNotExist { get { @@ -4157,7 +4399,7 @@ public static string FolderDoesNotExist { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Font smoothing ähnelt. + /// Looks up a localized string similar to Font smoothing. /// public static string FontSmoothing { get { @@ -4166,7 +4408,7 @@ public static string FontSmoothing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Format ähnelt. + /// Looks up a localized string similar to Format. /// public static string Format { get { @@ -4175,7 +4417,7 @@ public static string Format { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Found ähnelt. + /// Looks up a localized string similar to Found. /// public static string Found { get { @@ -4184,7 +4426,7 @@ public static string Found { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Frequency ähnelt. + /// Looks up a localized string similar to Frequency. /// public static string Frequency { get { @@ -4193,7 +4435,7 @@ public static string Frequency { } /// - /// Sucht eine lokalisierte Zeichenfolge, die (from profile) ähnelt. + /// Looks up a localized string similar to (from profile). /// public static string FromProfile { get { @@ -4202,7 +4444,7 @@ public static string FromProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Fullscreen ähnelt. + /// Looks up a localized string similar to Fullscreen. /// public static string Fullscreen { get { @@ -4211,7 +4453,7 @@ public static string Fullscreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gateway ähnelt. + /// Looks up a localized string similar to Gateway. /// public static string Gateway { get { @@ -4220,7 +4462,7 @@ public static string Gateway { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gateway / Router ähnelt. + /// Looks up a localized string similar to Gateway / Router. /// public static string GatewayRouter { get { @@ -4229,7 +4471,7 @@ public static string GatewayRouter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gateway server ähnelt. + /// Looks up a localized string similar to Gateway server. /// public static string GatewayServer { get { @@ -4238,7 +4480,7 @@ public static string GatewayServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to General. /// public static string General { get { @@ -4247,7 +4489,7 @@ public static string General { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Geolocation ähnelt. + /// Looks up a localized string similar to Geolocation. /// public static string Geolocation { get { @@ -4256,7 +4498,7 @@ public static string Geolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2.4 GHz ähnelt. + /// Looks up a localized string similar to 2.4 GHz. /// public static string GHz2dot4 { get { @@ -4265,7 +4507,7 @@ public static string GHz2dot4 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 5 GHz ähnelt. + /// Looks up a localized string similar to 5 GHz. /// public static string GHz5 { get { @@ -4274,7 +4516,7 @@ public static string GHz5 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 6 GHz ähnelt. + /// Looks up a localized string similar to 6 GHz. /// public static string GHz6 { get { @@ -4283,7 +4525,7 @@ public static string GHz6 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gigabits ähnelt. + /// Looks up a localized string similar to Gigabits. /// public static string Gigabits { get { @@ -4292,7 +4534,7 @@ public static string Gigabits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Gigabytes ähnelt. + /// Looks up a localized string similar to Gigabytes. /// public static string Gigabytes { get { @@ -4301,7 +4543,7 @@ public static string Gigabytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Got "{0}" as public ip address from "{1}"! ähnelt. + /// Looks up a localized string similar to Got "{0}" as public ip address from "{1}"!. /// public static string GotXXXAsPublicIPAddressFromXXXMessage { get { @@ -4310,7 +4552,7 @@ public static string GotXXXAsPublicIPAddressFromXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Green ähnelt. + /// Looks up a localized string similar to Green. /// public static string Green { get { @@ -4319,7 +4561,7 @@ public static string Green { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Group ähnelt. + /// Looks up a localized string similar to Group. /// public static string Group { get { @@ -4328,7 +4570,7 @@ public static string Group { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Group / domain name ähnelt. + /// Looks up a localized string similar to Group / domain name. /// public static string GroupDomainName { get { @@ -4337,7 +4579,7 @@ public static string GroupDomainName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Group name cannot start with "{0}"! ähnelt. + /// Looks up a localized string similar to Group name cannot start with "{0}"!. /// public static string GroupNameCannotStartWithX { get { @@ -4346,7 +4588,7 @@ public static string GroupNameCannotStartWithX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Groups ähnelt. + /// Looks up a localized string similar to Groups. /// public static string Groups { get { @@ -4355,7 +4597,7 @@ public static string Groups { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Headers ähnelt. + /// Looks up a localized string similar to Headers. /// public static string Headers { get { @@ -4364,7 +4606,7 @@ public static string Headers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Height ähnelt. + /// Looks up a localized string similar to Height. /// public static string Height { get { @@ -4373,7 +4615,7 @@ public static string Height { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Help ähnelt. + /// Looks up a localized string similar to Help. /// public static string Help { get { @@ -4382,11 +4624,11 @@ public static string Help { } /// - /// Sucht eine lokalisierte Zeichenfolge, die If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. + /// Looks up a localized string similar to If you enable this option, the default PowerShell console settings in the registry under HKCU:\Console are overridden so that the PowerShell console window matches the application theme. This is a global system setting that may affect the appearance of the normal PowerShell window. /// ///Only the PowerShell consoles configured in the PowerShell and AWS Session Manager settings are modified. Both Windows PowerShell and PWSH (PowerShell 7 and higher) are supported. /// - ///Click in the upper right corner on the help [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + ///Click in the upper right corner on the help [rest of string was truncated]";. /// public static string HelpMessage_ApplyThemeToPowerShellConsole { get { @@ -4395,11 +4637,11 @@ public static string HelpMessage_ApplyThemeToPowerShellConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The background job will save settings and profiles every x-minutes. + /// Looks up a localized string similar to The background job will save settings and profiles every x-minutes. /// ///Value 0 will disable this feature. /// - ///Changes to this value will take effect after restarting the application. ähnelt. + ///Changes to this value will take effect after restarting the application.. /// public static string HelpMessage_BackgroundJob { get { @@ -4408,9 +4650,9 @@ public static string HelpMessage_BackgroundJob { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The DNS resolver is determined via ip-api.com. + /// Looks up a localized string similar to The DNS resolver is determined via ip-api.com. /// - ///URL: https://edns.ip-api.com/ ähnelt. + ///URL: https://edns.ip-api.com/. /// public static string HelpMessage_CheckDNSResolver { get { @@ -4419,9 +4661,9 @@ public static string HelpMessage_CheckDNSResolver { } /// - /// Sucht eine lokalisierte Zeichenfolge, die When starting the program, it checks in the background whether a new program version is available on GitHub. + /// Looks up a localized string similar to When starting the program, it checks in the background whether a new program version is available on GitHub. /// - ///URL: https://api.github.com/ ähnelt. + ///URL: https://api.github.com/. /// public static string HelpMessage_CheckForUpdatesAtStartup { get { @@ -4430,9 +4672,9 @@ public static string HelpMessage_CheckForUpdatesAtStartup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The IP geolocation is determined via ip-api.com. + /// Looks up a localized string similar to The IP geolocation is determined via ip-api.com. /// - ///URL: http://ip-api.com/ ähnelt. + ///URL: http://ip-api.com/. /// public static string HelpMessage_CheckIPGeolocation { get { @@ -4441,9 +4683,9 @@ public static string HelpMessage_CheckIPGeolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The public IP address is determined via ipify.org. + /// Looks up a localized string similar to The public IP address is determined via ipify.org. /// - ///URL: https://api.ipify.org and https://api6.ipify.org ähnelt. + ///URL: https://api.ipify.org and https://api6.ipify.org. /// public static string HelpMessage_CheckPublicIPAddress { get { @@ -4452,7 +4694,7 @@ public static string HelpMessage_CheckPublicIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decrypt and load your credentials to select them. ähnelt. + /// Looks up a localized string similar to Decrypt and load your credentials to select them.. /// public static string HelpMessage_Credentials { get { @@ -4461,10 +4703,10 @@ public static string HelpMessage_Credentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following variables are available: + /// Looks up a localized string similar to The following variables are available: /// ///$$ipaddress$$ --> IP adresse - ///$$hostname$$ --> Hostname ähnelt. + ///$$hostname$$ --> Hostname. /// public static string HelpMessage_CustomCommandVariables { get { @@ -4473,7 +4715,7 @@ public static string HelpMessage_CustomCommandVariables { } /// - /// Sucht eine lokalisierte Zeichenfolge, die URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response. ähnelt. + /// Looks up a localized string similar to URL to a web service that can be reached via http or https and returns an IPv4 address e.g., "xx.xx.xx.xx" as response.. /// public static string HelpMessage_CustomPublicIPv4AddressAPI { get { @@ -4482,7 +4724,7 @@ public static string HelpMessage_CustomPublicIPv4AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response. ähnelt. + /// Looks up a localized string similar to URL to a web service that can be reached via http or https and returns an IPv6 address e.g., "xxxx:xx:xxx::xx" as response.. /// public static string HelpMessage_CustomPublicIPv6AddressAPI { get { @@ -4491,7 +4733,7 @@ public static string HelpMessage_CustomPublicIPv6AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release. ähnelt. + /// Looks up a localized string similar to Enable experimental features to test new functions. These are not yet complete, contain bugs, can crash the application and may change again until release.. /// public static string HelpMessage_ExperimentalFeatures { get { @@ -4500,7 +4742,7 @@ public static string HelpMessage_ExperimentalFeatures { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Number of backups that are retained before the oldest one is deleted. ähnelt. + /// Looks up a localized string similar to Number of backups that are retained before the oldest one is deleted.. /// public static string HelpMessage_MaximumNumberOfBackups { get { @@ -4509,7 +4751,7 @@ public static string HelpMessage_MaximumNumberOfBackups { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Application that is displayed at startup. ähnelt. + /// Looks up a localized string similar to Application that is displayed at startup.. /// public static string HelpMessage_ParameterApplication { get { @@ -4518,7 +4760,7 @@ public static string HelpMessage_ParameterApplication { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Displays this dialog. ähnelt. + /// Looks up a localized string similar to Displays this dialog.. /// public static string HelpMessage_ParameterHelp { get { @@ -4527,7 +4769,7 @@ public static string HelpMessage_ParameterHelp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resets all application settings. ähnelt. + /// Looks up a localized string similar to Resets all application settings.. /// public static string HelpMessage_ParameterResetSettings { get { @@ -4536,7 +4778,7 @@ public static string HelpMessage_ParameterResetSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The password is not displayed when editing, but can be overwritten. ähnelt. + /// Looks up a localized string similar to The password is not displayed when editing, but can be overwritten.. /// public static string HelpMessage_PasswordNotDisplayedCanBeOverwritten { get { @@ -4545,7 +4787,7 @@ public static string HelpMessage_PasswordNotDisplayedCanBeOverwritten { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv4 address reachable via ICMP. ähnelt. + /// Looks up a localized string similar to Public IPv4 address reachable via ICMP.. /// public static string HelpMessage_PublicIPv4Address { get { @@ -4554,7 +4796,7 @@ public static string HelpMessage_PublicIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv6 address reachable via ICMP. ähnelt. + /// Looks up a localized string similar to Public IPv6 address reachable via ICMP.. /// public static string HelpMessage_PublicIPv6Address { get { @@ -4563,7 +4805,7 @@ public static string HelpMessage_PublicIPv6Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH". ähnelt. + /// Looks up a localized string similar to SSH hostkey to use for the connection (e.g., "71:b8:f2:6e..."). Only available if the mode is "SSH".. /// public static string HelpMessage_PuTTYHostkey { get { @@ -4572,7 +4814,7 @@ public static string HelpMessage_PuTTYHostkey { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH". ähnelt. + /// Looks up a localized string similar to Full path to the private key file (e.g., "C:\Users\BornToBeRoot\SSH\private_key.ppk"). Only available if the mode is "SSH".. /// public static string HelpMessage_PuTTYPrivateKeyFile { get { @@ -4581,7 +4823,7 @@ public static string HelpMessage_PuTTYPrivateKeyFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin". ähnelt. + /// Looks up a localized string similar to Username that will be passed into the PuTTY session. Only available if the mode is "SSH", "Telnet" or "Rlogin".. /// public static string HelpMessage_PuTTYUsername { get { @@ -4590,10 +4832,10 @@ public static string HelpMessage_PuTTYUsername { } /// - /// Sucht eine lokalisierte Zeichenfolge, die [0] If server authentication fails, connect to the computer without warning. + /// Looks up a localized string similar to [0] If server authentication fails, connect to the computer without warning. ///[1] If server authentication fails, do not establish a connection. ///[2] If server authentication fails, show a warning and allow me to connect or refuse the connection. - ///[3] No authentication requirement is specified. ähnelt. + ///[3] No authentication requirement is specified.. /// public static string HelpMessage_RDPAuthenticationLevel { get { @@ -4602,7 +4844,7 @@ public static string HelpMessage_RDPAuthenticationLevel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Displays a dialog to save credentials after a successful sign-in. ähnelt. + /// Looks up a localized string similar to Displays a dialog to save credentials after a successful sign-in.. /// public static string HelpMessage_SaveCredentials { get { @@ -4611,7 +4853,7 @@ public static string HelpMessage_SaveCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Displays the status bar in the bottom-left of the WebView when hovering over a link. ähnelt. + /// Looks up a localized string similar to Displays the status bar in the bottom-left of the WebView when hovering over a link.. /// public static string HelpMessage_ShowStatusBar { get { @@ -4620,7 +4862,7 @@ public static string HelpMessage_ShowStatusBar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx". ähnelt. + /// Looks up a localized string similar to Tags help you organize profiles/Profiles by topics/projects. Multiple tags can be used with ";" be separated. Search by tags with "tag=xxx".. /// public static string HelpMessage_Tags { get { @@ -4629,13 +4871,13 @@ public static string HelpMessage_Tags { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. + /// Looks up a localized string similar to This setting specifies the minimum number of threads that will be created from the application's ThreadPool on demand. This can improve the performance for example of the IP scanner or port scanner. /// ///The value is added to the default min. threads (number of CPU threads). The value 0 leaves the default settings. If the value is higher than the default max. threads of the ThreadPool, this value is used. /// ///If the value is too high, performance problems may occur. /// - ///Changes to this value will take effect a [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + ///Changes to this value will take effect a [rest of string was truncated]";. /// public static string HelpMessage_ThreadPoolAdditionalMinThreads { get { @@ -4644,7 +4886,7 @@ public static string HelpMessage_ThreadPoolAdditionalMinThreads { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation. ähnelt. + /// Looks up a localized string similar to Use custom themes to personalize the appearance of the application. You can edit or add theme in the "Program Folder > Themes" directory. For more details, refer to the documentation.. /// public static string HelpMessage_UseCustomThemes { get { @@ -4653,7 +4895,7 @@ public static string HelpMessage_UseCustomThemes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hidden applications ähnelt. + /// Looks up a localized string similar to Hidden applications. /// public static string HiddenApplications { get { @@ -4662,7 +4904,7 @@ public static string HiddenApplications { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hidden Network ähnelt. + /// Looks up a localized string similar to Hidden Network. /// public static string HiddenNetwork { get { @@ -4671,7 +4913,7 @@ public static string HiddenNetwork { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hide ähnelt. + /// Looks up a localized string similar to Hide. /// public static string Hide { get { @@ -4680,7 +4922,7 @@ public static string Hide { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Highlight timeouts ähnelt. + /// Looks up a localized string similar to Highlight timeouts. /// public static string HighlightTimeouts { get { @@ -4689,7 +4931,7 @@ public static string HighlightTimeouts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die History ähnelt. + /// Looks up a localized string similar to History. /// public static string History { get { @@ -4698,7 +4940,7 @@ public static string History { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hop ähnelt. + /// Looks up a localized string similar to Hop. /// public static string Hop { get { @@ -4707,7 +4949,7 @@ public static string Hop { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hops ähnelt. + /// Looks up a localized string similar to Hops. /// public static string Hops { get { @@ -4716,7 +4958,7 @@ public static string Hops { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host ähnelt. + /// Looks up a localized string similar to Host. /// public static string Host { get { @@ -4725,7 +4967,7 @@ public static string Host { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hosting ähnelt. + /// Looks up a localized string similar to Hosting. /// public static string Hosting { get { @@ -4734,7 +4976,7 @@ public static string Hosting { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hostkey ähnelt. + /// Looks up a localized string similar to Hostkey. /// public static string Hostkey { get { @@ -4743,7 +4985,7 @@ public static string Hostkey { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hostname ähnelt. + /// Looks up a localized string similar to Hostname. /// public static string Hostname { get { @@ -4752,7 +4994,7 @@ public static string Hostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hostname or IP address ähnelt. + /// Looks up a localized string similar to Hostname or IP address. /// public static string HostnameOrIPAddress { get { @@ -4761,7 +5003,7 @@ public static string HostnameOrIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hosts ähnelt. + /// Looks up a localized string similar to Hosts. /// public static string Hosts { get { @@ -4770,7 +5012,7 @@ public static string Hosts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A backup of the "hosts" file could not be created! See log file for more details. ähnelt. + /// Looks up a localized string similar to A backup of the "hosts" file could not be created! See log file for more details.. /// public static string HostsFileBackupErrorMessage { get { @@ -4779,7 +5021,7 @@ public static string HostsFileBackupErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hosts File Editor ähnelt. + /// Looks up a localized string similar to Hosts File Editor. /// public static string HostsFileEditor { get { @@ -4788,7 +5030,7 @@ public static string HostsFileEditor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Read-only mode. Modifying the hosts file requires elevated rights! ähnelt. + /// Looks up a localized string similar to Read-only mode. Modifying the hosts file requires elevated rights!. /// public static string HostsFileEditorAdminMessage { get { @@ -4797,7 +5039,7 @@ public static string HostsFileEditorAdminMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The entry was not found in the "hosts" file! Maybe the file has been modified. ähnelt. + /// Looks up a localized string similar to The entry was not found in the "hosts" file! Maybe the file has been modified.. /// public static string HostsFileEntryNotFoundMessage { get { @@ -4806,7 +5048,7 @@ public static string HostsFileEntryNotFoundMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The "hosts" file could not be read! See log file for more details. ähnelt. + /// Looks up a localized string similar to The "hosts" file could not be read! See log file for more details.. /// public static string HostsFileReadErrorMessage { get { @@ -4815,7 +5057,7 @@ public static string HostsFileReadErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The "hosts" file could not be written to. See log file for more details. ähnelt. + /// Looks up a localized string similar to The "hosts" file could not be written to. See log file for more details.. /// public static string HostsFileWriteErrorMessage { get { @@ -4824,7 +5066,7 @@ public static string HostsFileWriteErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HotKeys ähnelt. + /// Looks up a localized string similar to HotKeys. /// public static string HotKeys { get { @@ -4833,7 +5075,7 @@ public static string HotKeys { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP Headers ähnelt. + /// Looks up a localized string similar to HTTP Headers. /// public static string HTTPHeaders { get { @@ -4842,7 +5084,7 @@ public static string HTTPHeaders { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HTTP status code ähnelt. + /// Looks up a localized string similar to HTTP status code. /// public static string HTTPStatusCode { get { @@ -4851,7 +5093,7 @@ public static string HTTPStatusCode { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ICMPv4 ähnelt. + /// Looks up a localized string similar to ICMPv4. /// public static string ICMPv4 { get { @@ -4860,7 +5102,7 @@ public static string ICMPv4 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ICMPv6 ähnelt. + /// Looks up a localized string similar to ICMPv6. /// public static string ICMPv6 { get { @@ -4869,7 +5111,7 @@ public static string ICMPv6 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ID ähnelt. + /// Looks up a localized string similar to ID. /// public static string ID { get { @@ -4878,7 +5120,7 @@ public static string ID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Import ähnelt. + /// Looks up a localized string similar to Import. /// public static string Import { get { @@ -4887,7 +5129,7 @@ public static string Import { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Import / Export ähnelt. + /// Looks up a localized string similar to Import / Export. /// public static string ImportExport { get { @@ -4896,7 +5138,16 @@ public static string ImportExport { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Indigo ähnelt. + /// Looks up a localized string similar to Inbound. + /// + public static string Inbound { + get { + return ResourceManager.GetString("Inbound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Indigo. /// public static string Indigo { get { @@ -4905,7 +5156,7 @@ public static string Indigo { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Information ähnelt. + /// Looks up a localized string similar to Information. /// public static string Information { get { @@ -4914,7 +5165,7 @@ public static string Information { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Infrastructure ähnelt. + /// Looks up a localized string similar to Infrastructure. /// public static string Infrastructure { get { @@ -4923,7 +5174,7 @@ public static string Infrastructure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Inherit host from general ähnelt. + /// Looks up a localized string similar to Inherit host from general. /// public static string InheritHostFromGeneral { get { @@ -4932,7 +5183,7 @@ public static string InheritHostFromGeneral { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Input ähnelt. + /// Looks up a localized string similar to Input. /// public static string Input { get { @@ -4941,7 +5192,7 @@ public static string Input { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Input cannot end with a ";"! ähnelt. + /// Looks up a localized string similar to Input cannot end with a ";"!. /// public static string InputCannotEndWithSemicolon { get { @@ -4950,7 +5201,7 @@ public static string InputCannotEndWithSemicolon { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Input does not contain any text! ähnelt. + /// Looks up a localized string similar to Input does not contain any text!. /// public static string InputDoesNotContainAnyText { get { @@ -4959,7 +5210,16 @@ public static string InputDoesNotContainAnyText { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Instance ID ähnelt. + /// Looks up a localized string similar to Input does exceed valid length. + /// + public static string InputLengthExceeded { + get { + return ResourceManager.GetString("InputLengthExceeded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instance ID. /// public static string InstanceId { get { @@ -4968,7 +5228,7 @@ public static string InstanceId { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Interface ähnelt. + /// Looks up a localized string similar to Interface. /// public static string Interface { get { @@ -4977,7 +5237,16 @@ public static string Interface { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internet ähnelt. + /// Looks up a localized string similar to Interface type. + /// + public static string InterfaceType { + get { + return ResourceManager.GetString("InterfaceType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internet. /// public static string Internet { get { @@ -4986,7 +5255,7 @@ public static string Internet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP address ähnelt. + /// Looks up a localized string similar to IP address. /// public static string IPAddress { get { @@ -4995,7 +5264,7 @@ public static string IPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP addresses ähnelt. + /// Looks up a localized string similar to IP addresses. /// public static string IPAddresses { get { @@ -5004,7 +5273,7 @@ public static string IPAddresses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP address to detect local ip address based on routing ähnelt. + /// Looks up a localized string similar to IP address to detect local ip address based on routing. /// public static string IPAddressToDetectLocalIPAddressBasedOnRouting { get { @@ -5013,8 +5282,8 @@ public static string IPAddressToDetectLocalIPAddressBasedOnRouting { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ip-api.com rate limit reached (too many requests from your network)! - ///Try again in a few seconds. ähnelt. + /// Looks up a localized string similar to ip-api.com rate limit reached (too many requests from your network)! + ///Try again in a few seconds.. /// public static string IPApiRateLimitMessage { get { @@ -5023,7 +5292,7 @@ public static string IPApiRateLimitMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP endpoint ähnelt. + /// Looks up a localized string similar to IP endpoint. /// public static string IPEndPoint { get { @@ -5032,7 +5301,7 @@ public static string IPEndPoint { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP geolocation ähnelt. + /// Looks up a localized string similar to IP geolocation. /// public static string IPGeolocation { get { @@ -5041,7 +5310,7 @@ public static string IPGeolocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP range ähnelt. + /// Looks up a localized string similar to IP range. /// public static string IPRange { get { @@ -5050,7 +5319,7 @@ public static string IPRange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IP Scanner ähnelt. + /// Looks up a localized string similar to IP Scanner. /// public static string IPScanner { get { @@ -5059,7 +5328,7 @@ public static string IPScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination host unreachable. ähnelt. + /// Looks up a localized string similar to Destination host unreachable.. /// public static string IPStatus_DestinationHostUnreachable { get { @@ -5068,7 +5337,7 @@ public static string IPStatus_DestinationHostUnreachable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination network unreachable. ähnelt. + /// Looks up a localized string similar to Destination network unreachable.. /// public static string IPStatus_DestinationNetworkUnreachable { get { @@ -5077,7 +5346,7 @@ public static string IPStatus_DestinationNetworkUnreachable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Destination port unreachable. ähnelt. + /// Looks up a localized string similar to Destination port unreachable.. /// public static string IPStatus_DestinationPortUnreachable { get { @@ -5086,7 +5355,7 @@ public static string IPStatus_DestinationPortUnreachable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Success ähnelt. + /// Looks up a localized string similar to Success. /// public static string IPStatus_Success { get { @@ -5095,7 +5364,7 @@ public static string IPStatus_Success { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Request timed out. ähnelt. + /// Looks up a localized string similar to Request timed out.. /// public static string IPStatus_TimedOut { get { @@ -5104,7 +5373,7 @@ public static string IPStatus_TimedOut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TTL expired in transit. ähnelt. + /// Looks up a localized string similar to TTL expired in transit.. /// public static string IPStatus_TtlExpired { get { @@ -5113,7 +5382,7 @@ public static string IPStatus_TtlExpired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 ähnelt. + /// Looks up a localized string similar to IPv4. /// public static string IPv4 { get { @@ -5122,7 +5391,7 @@ public static string IPv4 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 address ähnelt. + /// Looks up a localized string similar to IPv4 address. /// public static string IPv4Address { get { @@ -5131,7 +5400,7 @@ public static string IPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4-Default-Gateway ähnelt. + /// Looks up a localized string similar to IPv4-Default-Gateway. /// public static string IPv4DefaultGateway { get { @@ -5140,7 +5409,7 @@ public static string IPv4DefaultGateway { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv4 protocol available ähnelt. + /// Looks up a localized string similar to IPv4 protocol available. /// public static string IPv4ProtocolAvailable { get { @@ -5149,7 +5418,7 @@ public static string IPv4ProtocolAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 ähnelt. + /// Looks up a localized string similar to IPv6. /// public static string IPv6 { get { @@ -5158,7 +5427,7 @@ public static string IPv6 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 address ähnelt. + /// Looks up a localized string similar to IPv6 address. /// public static string IPv6Address { get { @@ -5167,7 +5436,7 @@ public static string IPv6Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Link-local IPv6 address ähnelt. + /// Looks up a localized string similar to Link-local IPv6 address. /// public static string IPv6AddressLinkLocal { get { @@ -5176,7 +5445,7 @@ public static string IPv6AddressLinkLocal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6-Default-Gateway ähnelt. + /// Looks up a localized string similar to IPv6-Default-Gateway. /// public static string IPv6DefaultGateway { get { @@ -5185,7 +5454,7 @@ public static string IPv6DefaultGateway { } /// - /// Sucht eine lokalisierte Zeichenfolge, die IPv6 protocol available ähnelt. + /// Looks up a localized string similar to IPv6 protocol available. /// public static string IPv6ProtocolAvailable { get { @@ -5194,7 +5463,7 @@ public static string IPv6ProtocolAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Is encrypted ähnelt. + /// Looks up a localized string similar to Is encrypted. /// public static string IsEncrypted { get { @@ -5203,7 +5472,7 @@ public static string IsEncrypted { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ISP ähnelt. + /// Looks up a localized string similar to ISP. /// public static string ISP { get { @@ -5212,7 +5481,7 @@ public static string ISP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Keyboard ähnelt. + /// Looks up a localized string similar to Keyboard. /// public static string Keyboard { get { @@ -5221,7 +5490,7 @@ public static string Keyboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Keyboard shortcuts ähnelt. + /// Looks up a localized string similar to Keyboard shortcuts. /// public static string KeyboardShortcuts { get { @@ -5230,7 +5499,7 @@ public static string KeyboardShortcuts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Key must have 8 characters or more! ähnelt. + /// Looks up a localized string similar to Key must have 8 characters or more!. /// public static string KeyMustHave8CharactersOrMore { get { @@ -5239,7 +5508,7 @@ public static string KeyMustHave8CharactersOrMore { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Kilobits ähnelt. + /// Looks up a localized string similar to Kilobits. /// public static string Kilobits { get { @@ -5248,7 +5517,7 @@ public static string Kilobits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Kilobytes ähnelt. + /// Looks up a localized string similar to Kilobytes. /// public static string Kilobytes { get { @@ -5257,7 +5526,7 @@ public static string Kilobytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. + /// Looks up a localized string similar to Language. /// public static string Language { get { @@ -5266,7 +5535,7 @@ public static string Language { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Last scan at {0} ähnelt. + /// Looks up a localized string similar to Last scan at {0}. /// public static string LastScanAtX { get { @@ -5275,7 +5544,7 @@ public static string LastScanAtX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Last usable IP address ähnelt. + /// Looks up a localized string similar to Last usable IP address. /// public static string LastUsableIPAddress { get { @@ -5284,7 +5553,7 @@ public static string LastUsableIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Latitude ähnelt. + /// Looks up a localized string similar to Latitude. /// public static string Latitude { get { @@ -5293,7 +5562,7 @@ public static string Latitude { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Libraries ähnelt. + /// Looks up a localized string similar to Libraries. /// public static string Libraries { get { @@ -5302,7 +5571,7 @@ public static string Libraries { } /// - /// Sucht eine lokalisierte Zeichenfolge, die AirspacePanel fixes all Airspace issues with WPF-hosted Winforms. ähnelt. + /// Looks up a localized string similar to AirspacePanel fixes all Airspace issues with WPF-hosted Winforms.. /// public static string Library_AirspaceFixer_Description { get { @@ -5311,7 +5580,7 @@ public static string Library_AirspaceFixer_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Shared Controlz for WPF and ... more ähnelt. + /// Looks up a localized string similar to Shared Controlz for WPF and ... more. /// public static string Library_ControlzEx_Description { get { @@ -5320,7 +5589,7 @@ public static string Library_ControlzEx_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die C#/WinRT provides packaged WinRT projection support for the C# language. ähnelt. + /// Looks up a localized string similar to C#/WinRT provides packaged WinRT projection support for the C# language.. /// public static string Library_CsWinRT_Description { get { @@ -5329,7 +5598,7 @@ public static string Library_CsWinRT_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups ähnelt. + /// Looks up a localized string similar to DnsClient.NET is a simple yet very powerful and high performant open source library for the .NET Framework to do DNS lookups. /// public static string Library_DnsClientNET_Description { get { @@ -5338,7 +5607,7 @@ public static string Library_DnsClientNET_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dragable and tearable tab control for WPF ähnelt. + /// Looks up a localized string similar to Dragable and tearable tab control for WPF. /// public static string Library_Dragablz_Description { get { @@ -5347,7 +5616,7 @@ public static string Library_Dragablz_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An easy to use drag'n'drop framework for WPF. ähnelt. + /// Looks up a localized string similar to An easy to use drag'n'drop framework for WPF.. /// public static string Library_GongSolutionsWpfDragDrop_Description { get { @@ -5356,7 +5625,7 @@ public static string Library_GongSolutionsWpfDragDrop_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers. ähnelt. + /// Looks up a localized string similar to C# library take care of complex network, IP, IPv4, IPv6, netmask, CIDR, subnet, subnetting, supernet, and supernetting calculation for .NET developers.. /// public static string Library_IPNetwork_Description { get { @@ -5365,7 +5634,7 @@ public static string Library_IPNetwork_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Simple, flexible, interactive & powerful charts, maps and gauges for .Net ähnelt. + /// Looks up a localized string similar to Simple, flexible, interactive & powerful charts, maps and gauges for .Net. /// public static string Library_LiveCharts_Description { get { @@ -5374,7 +5643,7 @@ public static string Library_LiveCharts_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A collection of loading indicators for WPF ähnelt. + /// Looks up a localized string similar to A collection of loading indicators for WPF. /// public static string Library_LoadingIndicatorsWPF_Description { get { @@ -5383,7 +5652,7 @@ public static string Library_LoadingIndicatorsWPF_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die log4net is a tool to help the programmer output log statements to a variety of output targets. ähnelt. + /// Looks up a localized string similar to log4net is a tool to help the programmer output log statements to a variety of output targets.. /// public static string Library_log4net_Description { get { @@ -5392,7 +5661,7 @@ public static string Library_log4net_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A toolkit for creating Metro / Modern UI styled WPF apps. ähnelt. + /// Looks up a localized string similar to A toolkit for creating Metro / Modern UI styled WPF apps.. /// public static string Library_MahAppsMetro_Description { get { @@ -5401,7 +5670,7 @@ public static string Library_MahAppsMetro_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Some awesome icons for WPF and UWP all together... ähnelt. + /// Looks up a localized string similar to Some awesome icons for WPF and UWP all together.... /// public static string Library_MahAppsMetroIconPacks_Description { get { @@ -5410,7 +5679,7 @@ public static string Library_MahAppsMetroIconPacks_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Json.NET is a popular high-performance JSON framework for .NET ähnelt. + /// Looks up a localized string similar to Json.NET is a popular high-performance JSON framework for .NET. /// public static string Library_NewtonsoftJson_Description { get { @@ -5419,7 +5688,7 @@ public static string Library_NewtonsoftJson_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty. ähnelt. + /// Looks up a localized string similar to Move a .NET Framework/.NET Core app runtime components and dependencies into a sub-directory and make it beauty.. /// public static string Library_nulastudioNetBeauty_Description { get { @@ -5428,7 +5697,7 @@ public static string Library_nulastudioNetBeauty_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A GitHub API client library for .NET ähnelt. + /// Looks up a localized string similar to A GitHub API client library for .NET. /// public static string Library_Octokit_Description { get { @@ -5437,7 +5706,7 @@ public static string Library_Octokit_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Runtime for hosting PowerShell ähnelt. + /// Looks up a localized string similar to Runtime for hosting PowerShell. /// public static string Library_PowerShellSDK_Description { get { @@ -5446,7 +5715,7 @@ public static string Library_PowerShellSDK_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Capture and parse CDP and LLDP packets on local or remote computers ähnelt. + /// Looks up a localized string similar to Capture and parse CDP and LLDP packets on local or remote computers. /// public static string Library_PSDicoveryProtocol_Description { get { @@ -5455,7 +5724,7 @@ public static string Library_PSDicoveryProtocol_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sharp SNMP Library - Open Source SNMP for .NET and Mono ähnelt. + /// Looks up a localized string similar to Sharp SNMP Library - Open Source SNMP for .NET and Mono. /// public static string Library_SharpSNMP_Description { get { @@ -5464,7 +5733,7 @@ public static string Library_SharpSNMP_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium). ähnelt. + /// Looks up a localized string similar to The WebView2 control enables you to embed web technologies (HTML, CSS, and JavaScript) in your native applications powered by Microsoft Edge (Chromium).. /// public static string Library_WebView2_Description { get { @@ -5473,7 +5742,7 @@ public static string Library_WebView2_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Easily add interactivity to your apps using XAML Behaviors for WPF. ähnelt. + /// Looks up a localized string similar to Easily add interactivity to your apps using XAML Behaviors for WPF.. /// public static string Library_XamlBehaviorsWpf_Description { get { @@ -5482,7 +5751,7 @@ public static string Library_XamlBehaviorsWpf_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die License ähnelt. + /// Looks up a localized string similar to License. /// public static string License { get { @@ -5491,7 +5760,7 @@ public static string License { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Apache License 2.0 ähnelt. + /// Looks up a localized string similar to Apache License 2.0. /// public static string License_ApacheLicense2dot0 { get { @@ -5500,7 +5769,7 @@ public static string License_ApacheLicense2dot0 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die BSD-2-Clause ähnelt. + /// Looks up a localized string similar to BSD-2-Clause. /// public static string License_BDS2Clause { get { @@ -5509,7 +5778,7 @@ public static string License_BDS2Clause { } /// - /// Sucht eine lokalisierte Zeichenfolge, die BSD-3-Clause ähnelt. + /// Looks up a localized string similar to BSD-3-Clause. /// public static string License_BDS3Clause { get { @@ -5518,7 +5787,7 @@ public static string License_BDS3Clause { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft WebView2 License ähnelt. + /// Looks up a localized string similar to Microsoft WebView2 License. /// public static string License_MicrosoftWebView2License { get { @@ -5527,7 +5796,7 @@ public static string License_MicrosoftWebView2License { } /// - /// Sucht eine lokalisierte Zeichenfolge, die MIT License ähnelt. + /// Looks up a localized string similar to MIT License. /// public static string License_MITLicense { get { @@ -5536,7 +5805,7 @@ public static string License_MITLicense { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlicense ähnelt. + /// Looks up a localized string similar to Unlicense. /// public static string License_Unlicense { get { @@ -5545,7 +5814,7 @@ public static string License_Unlicense { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lime ähnelt. + /// Looks up a localized string similar to Lime. /// public static string Lime { get { @@ -5554,7 +5823,7 @@ public static string Lime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listeners ähnelt. + /// Looks up a localized string similar to Listeners. /// public static string Listeners { get { @@ -5563,7 +5832,7 @@ public static string Listeners { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LLDP / CDP ähnelt. + /// Looks up a localized string similar to LLDP / CDP. /// public static string LldpCdp { get { @@ -5572,7 +5841,7 @@ public static string LldpCdp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local connection ähnelt. + /// Looks up a localized string similar to Local connection. /// public static string LocalConnection { get { @@ -5581,7 +5850,7 @@ public static string LocalConnection { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local devices and resources ähnelt. + /// Looks up a localized string similar to Local devices and resources. /// public static string LocalDevicesAndResources { get { @@ -5590,7 +5859,7 @@ public static string LocalDevicesAndResources { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local end time ähnelt. + /// Looks up a localized string similar to Local end time. /// public static string LocalEndTime { get { @@ -5599,7 +5868,7 @@ public static string LocalEndTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local interface ähnelt. + /// Looks up a localized string similar to Local interface. /// public static string LocalInterface { get { @@ -5608,7 +5877,7 @@ public static string LocalInterface { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local IP address ähnelt. + /// Looks up a localized string similar to Local IP address. /// public static string LocalIPAddress { get { @@ -5617,7 +5886,7 @@ public static string LocalIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local port ähnelt. + /// Looks up a localized string similar to Local port. /// public static string LocalPort { get { @@ -5626,7 +5895,16 @@ public static string LocalPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local start time ähnelt. + /// Looks up a localized string similar to Local ports. + /// + public static string LocalPorts { + get { + return ResourceManager.GetString("LocalPorts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Local start time. /// public static string LocalStartTime { get { @@ -5635,7 +5913,7 @@ public static string LocalStartTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location ähnelt. + /// Looks up a localized string similar to Location. /// public static string Location { get { @@ -5644,7 +5922,7 @@ public static string Location { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location cannot be changed in portable version! ähnelt. + /// Looks up a localized string similar to Location cannot be changed in portable version!. /// public static string LocationCannotBeChangedInThePortableVersion { get { @@ -5653,7 +5931,7 @@ public static string LocationCannotBeChangedInThePortableVersion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location... ähnelt. + /// Looks up a localized string similar to Location.... /// public static string LocationDots { get { @@ -5662,7 +5940,7 @@ public static string LocationDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Location of the import file... ähnelt. + /// Looks up a localized string similar to Location of the import file.... /// public static string LocationOfTheImport { get { @@ -5671,7 +5949,7 @@ public static string LocationOfTheImport { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log ähnelt. + /// Looks up a localized string similar to Log. /// public static string Log { get { @@ -5680,7 +5958,7 @@ public static string Log { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log file name ähnelt. + /// Looks up a localized string similar to Log file name. /// public static string LogFileName { get { @@ -5689,7 +5967,7 @@ public static string LogFileName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log mode ähnelt. + /// Looks up a localized string similar to Log mode. /// public static string LogMode { get { @@ -5698,7 +5976,7 @@ public static string LogMode { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Logon method ähnelt. + /// Looks up a localized string similar to Logon method. /// public static string LogonMethod { get { @@ -5707,7 +5985,7 @@ public static string LogonMethod { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Log path ähnelt. + /// Looks up a localized string similar to Log path. /// public static string LogPath { get { @@ -5716,7 +5994,7 @@ public static string LogPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Longitude ähnelt. + /// Looks up a localized string similar to Longitude. /// public static string Longitude { get { @@ -5725,7 +6003,7 @@ public static string Longitude { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lookup ähnelt. + /// Looks up a localized string similar to Lookup. /// public static string Lookup { get { @@ -5734,7 +6012,7 @@ public static string Lookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Lost ähnelt. + /// Looks up a localized string similar to Lost. /// public static string Lost { get { @@ -5743,7 +6021,7 @@ public static string Lost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die MAC Address ähnelt. + /// Looks up a localized string similar to MAC Address. /// public static string MACAddress { get { @@ -5752,7 +6030,7 @@ public static string MACAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die MAC address or vendor ähnelt. + /// Looks up a localized string similar to MAC address or vendor. /// public static string MACAddressOrVendor { get { @@ -5761,7 +6039,7 @@ public static string MACAddressOrVendor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magenta ähnelt. + /// Looks up a localized string similar to Magenta. /// public static string Magenta { get { @@ -5770,7 +6048,7 @@ public static string Magenta { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Magic packet successfully sent! ähnelt. + /// Looks up a localized string similar to Magic packet successfully sent!. /// public static string MagicPacketSentMessage { get { @@ -5779,7 +6057,7 @@ public static string MagicPacketSentMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Management ähnelt. + /// Looks up a localized string similar to Management. /// public static string Management { get { @@ -5788,7 +6066,7 @@ public static string Management { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Master Password ähnelt. + /// Looks up a localized string similar to Master Password. /// public static string MasterPassword { get { @@ -5797,7 +6075,7 @@ public static string MasterPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Match ähnelt. + /// Looks up a localized string similar to Match. /// public static string Match { get { @@ -5806,7 +6084,7 @@ public static string Match { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mauve ähnelt. + /// Looks up a localized string similar to Mauve. /// public static string Mauve { get { @@ -5815,7 +6093,7 @@ public static string Mauve { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Max. concurrent host threads ähnelt. + /// Looks up a localized string similar to Max. concurrent host threads. /// public static string MaxHostThreads { get { @@ -5824,7 +6102,7 @@ public static string MaxHostThreads { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum ähnelt. + /// Looks up a localized string similar to Maximum. /// public static string Maximum { get { @@ -5833,7 +6111,7 @@ public static string Maximum { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum hops ähnelt. + /// Looks up a localized string similar to Maximum hops. /// public static string MaximumHops { get { @@ -5842,7 +6120,7 @@ public static string MaximumHops { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum number of backups ähnelt. + /// Looks up a localized string similar to Maximum number of backups. /// public static string MaximumNumberOfBackups { get { @@ -5851,7 +6129,7 @@ public static string MaximumNumberOfBackups { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Maximum number ({0}) of hops/router reached! ähnelt. + /// Looks up a localized string similar to Maximum number ({0}) of hops/router reached!. /// public static string MaximumNumberOfHopsReached { get { @@ -5860,7 +6138,16 @@ public static string MaximumNumberOfHopsReached { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Max. concurrent port threads ähnelt. + /// Looks up a localized string similar to Maximum length of port entries. + /// + public static string MaxLengthOfPortEntries { + get { + return ResourceManager.GetString("MaxLengthOfPortEntries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max. concurrent port threads. /// public static string MaxPortThreads { get { @@ -5869,7 +6156,7 @@ public static string MaxPortThreads { } /// - /// Sucht eine lokalisierte Zeichenfolge, die These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application. ähnelt. + /// Looks up a localized string similar to These settings only change the maximum number of concurrently executed threads per host/port scan. Go to Settings > General > General to adjust the (min) threads of the application.. /// public static string MaxThreadsOnlyGoToSettingsGeneralGeneral { get { @@ -5878,7 +6165,7 @@ public static string MaxThreadsOnlyGoToSettingsGeneralGeneral { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Measured time ähnelt. + /// Looks up a localized string similar to Measured time. /// public static string MeasuredTime { get { @@ -5887,7 +6174,7 @@ public static string MeasuredTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Megabits ähnelt. + /// Looks up a localized string similar to Megabits. /// public static string Megabits { get { @@ -5896,7 +6183,7 @@ public static string Megabits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Megabytes ähnelt. + /// Looks up a localized string similar to Megabytes. /// public static string Megabytes { get { @@ -5905,7 +6192,7 @@ public static string Megabytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Menu and window animation ähnelt. + /// Looks up a localized string similar to Menu and window animation. /// public static string MenuAndWindowAnimation { get { @@ -5914,7 +6201,7 @@ public static string MenuAndWindowAnimation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Merge ähnelt. + /// Looks up a localized string similar to Merge. /// public static string Merge { get { @@ -5923,7 +6210,7 @@ public static string Merge { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Message size ähnelt. + /// Looks up a localized string similar to Message size. /// public static string MessageSize { get { @@ -5932,7 +6219,7 @@ public static string MessageSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die MIB ähnelt. + /// Looks up a localized string similar to MIB. /// public static string MIB { get { @@ -5941,7 +6228,7 @@ public static string MIB { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft Edge WebView2 Runtime is not available! ähnelt. + /// Looks up a localized string similar to Microsoft Edge WebView2 Runtime is not available!. /// public static string MicrosoftEdgeWebView2RuntimeIsNotAvailable { get { @@ -5950,7 +6237,7 @@ public static string MicrosoftEdgeWebView2RuntimeIsNotAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server). ähnelt. + /// Looks up a localized string similar to Microsoft.Windows.SDK.Contracts is required for this feature but not available on this system (e.g. on Windows Server).. /// public static string MicrosoftWindowsSDKContractsIsNotAvailable { get { @@ -5959,7 +6246,7 @@ public static string MicrosoftWindowsSDKContractsIsNotAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Migrate ähnelt. + /// Looks up a localized string similar to Migrate. /// public static string Migrate { get { @@ -5968,7 +6255,7 @@ public static string Migrate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimize main window instead of terminating the application ähnelt. + /// Looks up a localized string similar to Minimize main window instead of terminating the application. /// public static string MinimizeInsteadOfTerminating { get { @@ -5977,7 +6264,7 @@ public static string MinimizeInsteadOfTerminating { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimize to tray instead of taskbar ähnelt. + /// Looks up a localized string similar to Minimize to tray instead of taskbar. /// public static string MinimizeToTrayInsteadOfTaskbar { get { @@ -5986,7 +6273,7 @@ public static string MinimizeToTrayInsteadOfTaskbar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minimum ähnelt. + /// Looks up a localized string similar to Minimum. /// public static string Minimum { get { @@ -5995,7 +6282,7 @@ public static string Minimum { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mobile ähnelt. + /// Looks up a localized string similar to Mobile. /// public static string Mobile { get { @@ -6004,7 +6291,7 @@ public static string Mobile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Mode ähnelt. + /// Looks up a localized string similar to Mode. /// public static string Mode { get { @@ -6013,7 +6300,7 @@ public static string Mode { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Model ähnelt. + /// Looks up a localized string similar to Model. /// public static string Model { get { @@ -6022,7 +6309,7 @@ public static string Model { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Move ähnelt. + /// Looks up a localized string similar to Move. /// public static string Move { get { @@ -6031,7 +6318,7 @@ public static string Move { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Move & Restart ähnelt. + /// Looks up a localized string similar to Move & Restart. /// public static string MoveAndRestart { get { @@ -6040,7 +6327,7 @@ public static string MoveAndRestart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multicast ähnelt. + /// Looks up a localized string similar to Multicast. /// public static string Multicast { get { @@ -6049,7 +6336,7 @@ public static string Multicast { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multiple instances ähnelt. + /// Looks up a localized string similar to Multiple instances. /// public static string MultipleInstances { get { @@ -6058,7 +6345,7 @@ public static string MultipleInstances { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Multithreading ähnelt. + /// Looks up a localized string similar to Multithreading. /// public static string Multithreading { get { @@ -6067,7 +6354,7 @@ public static string Multithreading { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Name ähnelt. + /// Looks up a localized string similar to Name. /// public static string Name { get { @@ -6076,7 +6363,7 @@ public static string Name { } /// - /// Sucht eine lokalisierte Zeichenfolge, die NetBIOS ähnelt. + /// Looks up a localized string similar to NetBIOS. /// public static string NetBIOS { get { @@ -6085,7 +6372,7 @@ public static string NetBIOS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die NetBIOS scan is disabled! ähnelt. + /// Looks up a localized string similar to NetBIOS scan is disabled!. /// public static string NetBIOSIsDisabled { get { @@ -6094,7 +6381,7 @@ public static string NetBIOSIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die NetBIOS reachable ähnelt. + /// Looks up a localized string similar to NetBIOS reachable. /// public static string NetBIOSReachable { get { @@ -6103,7 +6390,16 @@ public static string NetBIOSReachable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network ähnelt. + /// Looks up a localized string similar to . + /// + public static string NetProfilePrivate { + get { + return ResourceManager.GetString("NetProfilePrivate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Network. /// public static string Network { get { @@ -6112,7 +6408,7 @@ public static string Network { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network address ähnelt. + /// Looks up a localized string similar to Network address. /// public static string NetworkAddress { get { @@ -6121,7 +6417,16 @@ public static string NetworkAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network connections.... ähnelt. + /// Looks up a localized string similar to Network connection profile. + /// + public static string NetworkConnectionProfile { + get { + return ResourceManager.GetString("NetworkConnectionProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Network connections..... /// public static string NetworkConnectionsDots { get { @@ -6130,7 +6435,7 @@ public static string NetworkConnectionsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network connection type ähnelt. + /// Looks up a localized string similar to Network connection type. /// public static string NetworkConnectionType { get { @@ -6139,7 +6444,7 @@ public static string NetworkConnectionType { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network Interface ähnelt. + /// Looks up a localized string similar to Network Interface. /// public static string NetworkInterface { get { @@ -6148,7 +6453,7 @@ public static string NetworkInterface { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network kind ähnelt. + /// Looks up a localized string similar to Network kind. /// public static string NetworkKind { get { @@ -6157,7 +6462,7 @@ public static string NetworkKind { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help. ähnelt. + /// Looks up a localized string similar to The network address cannot be reached. Check if your computer is connected to the network. For information about network troubleshooting, see Windows Help.. /// public static string NetworkLocationCannotBeReachedMessage { get { @@ -6166,7 +6471,7 @@ public static string NetworkLocationCannotBeReachedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Analysing network packets requires elevated rights! ähnelt. + /// Looks up a localized string similar to Analysing network packets requires elevated rights!. /// public static string NetworkPacketsCaptureAdminMessage { get { @@ -6175,7 +6480,16 @@ public static string NetworkPacketsCaptureAdminMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Networks ähnelt. + /// Looks up a localized string similar to Network profile. + /// + public static string NetworkProfile { + get { + return ResourceManager.GetString("NetworkProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Networks. /// public static string Networks { get { @@ -6184,7 +6498,7 @@ public static string Networks { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network time ähnelt. + /// Looks up a localized string similar to Network time. /// public static string NetworkTime { get { @@ -6193,7 +6507,7 @@ public static string NetworkTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network unavailable! ähnelt. + /// Looks up a localized string similar to Network unavailable!. /// public static string NetworkUnavailable { get { @@ -6202,7 +6516,7 @@ public static string NetworkUnavailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network usage ähnelt. + /// Looks up a localized string similar to Network usage. /// public static string NetworkUsage { get { @@ -6211,7 +6525,7 @@ public static string NetworkUsage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die New connection... ähnelt. + /// Looks up a localized string similar to New connection.... /// public static string NewConnectionDots { get { @@ -6220,7 +6534,7 @@ public static string NewConnectionDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die New password ähnelt. + /// Looks up a localized string similar to New password. /// public static string NewPassword { get { @@ -6229,7 +6543,7 @@ public static string NewPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die New subnet mask ähnelt. + /// Looks up a localized string similar to New subnet mask. /// public static string NewSubnetMask { get { @@ -6238,7 +6552,7 @@ public static string NewSubnetMask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die New subnetmask or CIDR ähnelt. + /// Looks up a localized string similar to New subnetmask or CIDR. /// public static string NewSubnetmaskOrCIDR { get { @@ -6247,7 +6561,7 @@ public static string NewSubnetmaskOrCIDR { } /// - /// Sucht eine lokalisierte Zeichenfolge, die New tab ähnelt. + /// Looks up a localized string similar to New tab. /// public static string NewTab { get { @@ -6256,7 +6570,7 @@ public static string NewTab { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No ähnelt. + /// Looks up a localized string similar to No. /// public static string No { get { @@ -6265,7 +6579,7 @@ public static string No { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No A dns records resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to No A dns records resolved for "{0}"!. /// public static string NoADNSRecordsResolvedForXXXMessage { get { @@ -6274,7 +6588,7 @@ public static string NoADNSRecordsResolvedForXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No discovery protocol packages received! ähnelt. + /// Looks up a localized string similar to No discovery protocol packages received!. /// public static string NoDiscoveryProtocolPackagesReceived { get { @@ -6283,7 +6597,7 @@ public static string NoDiscoveryProtocolPackagesReceived { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No DNS record found for "{0}"! Check your input and the settings. ähnelt. + /// Looks up a localized string similar to No DNS record found for "{0}"! Check your input and the settings.. /// public static string NoDNSRecordFoundCheckYourInputAndSettings { get { @@ -6292,7 +6606,7 @@ public static string NoDNSRecordFoundCheckYourInputAndSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No enabled network adapters found! ähnelt. + /// Looks up a localized string similar to No enabled network adapters found!. /// public static string NoEnabledNetworkAdaptersFound { get { @@ -6301,7 +6615,7 @@ public static string NoEnabledNetworkAdaptersFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No matching commands! ähnelt. + /// Looks up a localized string similar to No matching commands!. /// public static string NoMatchingCommands { get { @@ -6310,7 +6624,7 @@ public static string NoMatchingCommands { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No open ports found! ähnelt. + /// Looks up a localized string similar to No open ports found!. /// public static string NoOpenPortsFound { get { @@ -6319,7 +6633,7 @@ public static string NoOpenPortsFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No ports found. Check your input! ähnelt. + /// Looks up a localized string similar to No ports found. Check your input!. /// public static string NoPortsFoundCheckYourInput { get { @@ -6328,8 +6642,8 @@ public static string NoPortsFoundCheckYourInput { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No profiles found! - ///Create one... ähnelt. + /// Looks up a localized string similar to No profiles found! + ///Create one.... /// public static string NoProfilesFoundCreateOne { get { @@ -6338,7 +6652,7 @@ public static string NoProfilesFoundCreateOne { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No PTR dns record resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to No PTR dns record resolved for "{0}"!. /// public static string NoPTRDNSRecordResolvedForXXXMessage { get { @@ -6347,7 +6661,7 @@ public static string NoPTRDNSRecordResolvedForXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No reachable hosts found! ähnelt. + /// Looks up a localized string similar to No reachable hosts found!. /// public static string NoReachableHostsFound { get { @@ -6356,7 +6670,7 @@ public static string NoReachableHostsFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No tags found! ähnelt. + /// Looks up a localized string similar to No tags found!. /// public static string NoTagsFound { get { @@ -6365,7 +6679,7 @@ public static string NoTagsFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Notation ähnelt. + /// Looks up a localized string similar to Notation. /// public static string Notation { get { @@ -6374,7 +6688,7 @@ public static string Notation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die (not changed) ähnelt. + /// Looks up a localized string similar to (not changed). /// public static string NotChanged { get { @@ -6383,7 +6697,16 @@ public static string NotChanged { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Note ähnelt. + /// Looks up a localized string similar to Not configured. + /// + public static string NotConfigured { + get { + return ResourceManager.GetString("NotConfigured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Note. /// public static string Note { get { @@ -6392,7 +6715,7 @@ public static string Note { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Nothing found! ähnelt. + /// Looks up a localized string similar to Nothing found!. /// public static string NothingFound { get { @@ -6401,7 +6724,7 @@ public static string NothingFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Nothing to do. Check your input! ähnelt. + /// Looks up a localized string similar to Nothing to do. Check your input!. /// public static string NothingToDoCheckYourInput { get { @@ -6410,7 +6733,7 @@ public static string NothingToDoCheckYourInput { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No update available! ähnelt. + /// Looks up a localized string similar to No update available!. /// public static string NoUpdateAvailable { get { @@ -6419,7 +6742,7 @@ public static string NoUpdateAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No valid file found to import. ähnelt. + /// Looks up a localized string similar to No valid file found to import.. /// public static string NoValidFileFoundToImport { get { @@ -6428,7 +6751,7 @@ public static string NoValidFileFoundToImport { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"! ähnelt. + /// Looks up a localized string similar to A valid path to PowerShell should end with "pwsh.exe" or "powershell.exe"!. /// public static string NoValidPowerShellPath { get { @@ -6437,7 +6760,7 @@ public static string NoValidPowerShellPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A valid path to PuTTY should end with "PuTTY.exe"! ähnelt. + /// Looks up a localized string similar to A valid path to PuTTY should end with "PuTTY.exe"!. /// public static string NoValidPuTTYPath { get { @@ -6446,7 +6769,7 @@ public static string NoValidPuTTYPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"! ähnelt. + /// Looks up a localized string similar to A valid path to TigerVNC should end with "vncviewer-*.exe" or "vncviewer64-*.exe"!. /// public static string NoValidTigerVNCPath { get { @@ -6455,7 +6778,7 @@ public static string NoValidTigerVNCPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No vendor found. Check your input! ähnelt. + /// Looks up a localized string similar to No vendor found. Check your input!. /// public static string NoVendorFoundCheckYourInput { get { @@ -6464,7 +6787,7 @@ public static string NoVendorFoundCheckYourInput { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No WiFi adapters found! ähnelt. + /// Looks up a localized string similar to No WiFi adapters found!. /// public static string NoWiFiAdaptersFound { get { @@ -6473,7 +6796,7 @@ public static string NoWiFiAdaptersFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No WiFi networks found! ähnelt. + /// Looks up a localized string similar to No WiFi networks found!. /// public static string NoWiFiNetworksFound { get { @@ -6482,7 +6805,7 @@ public static string NoWiFiNetworksFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Number of errors after which is canceled: ähnelt. + /// Looks up a localized string similar to Number of errors after which is canceled:. /// public static string NumberOfErrorsAfterWhichIsCanceled { get { @@ -6491,7 +6814,7 @@ public static string NumberOfErrorsAfterWhichIsCanceled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Number of stored entries ähnelt. + /// Looks up a localized string similar to Number of stored entries. /// public static string NumberOfStoredEntries { get { @@ -6500,7 +6823,7 @@ public static string NumberOfStoredEntries { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Obtain an IP address automatically ähnelt. + /// Looks up a localized string similar to Obtain an IP address automatically. /// public static string ObtainAnIPAddressAutomatically { get { @@ -6509,7 +6832,7 @@ public static string ObtainAnIPAddressAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Obtain DNS server address automatically ähnelt. + /// Looks up a localized string similar to Obtain DNS server address automatically. /// public static string ObtainDNSServerAddressAutomatically { get { @@ -6518,7 +6841,7 @@ public static string ObtainDNSServerAddressAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Off ähnelt. + /// Looks up a localized string similar to Off. /// public static string Off { get { @@ -6527,7 +6850,7 @@ public static string Off { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Official ähnelt. + /// Looks up a localized string similar to Official. /// public static string Official { get { @@ -6536,7 +6859,7 @@ public static string Official { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Offset ähnelt. + /// Looks up a localized string similar to Offset. /// public static string Offset { get { @@ -6545,7 +6868,7 @@ public static string Offset { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OID ähnelt. + /// Looks up a localized string similar to OID. /// public static string OID { get { @@ -6554,7 +6877,7 @@ public static string OID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OID profiles ähnelt. + /// Looks up a localized string similar to OID profiles. /// public static string OIDProfiles { get { @@ -6563,7 +6886,7 @@ public static string OIDProfiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. + /// Looks up a localized string similar to OK. /// public static string OK { get { @@ -6572,7 +6895,7 @@ public static string OK { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Olive ähnelt. + /// Looks up a localized string similar to Olive. /// public static string Olive { get { @@ -6581,7 +6904,7 @@ public static string Olive { } /// - /// Sucht eine lokalisierte Zeichenfolge, die On ähnelt. + /// Looks up a localized string similar to On. /// public static string On { get { @@ -6590,7 +6913,7 @@ public static string On { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Only numbers can be entered! ähnelt. + /// Looks up a localized string similar to Only numbers can be entered!. /// public static string OnlyNumbersCanBeEntered { get { @@ -6599,7 +6922,7 @@ public static string OnlyNumbersCanBeEntered { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Only when using the full screen ähnelt. + /// Looks up a localized string similar to Only when using the full screen. /// public static string OnlyWhenUsingTheFullScreen { get { @@ -6608,7 +6931,7 @@ public static string OnlyWhenUsingTheFullScreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open ähnelt. + /// Looks up a localized string similar to Open. /// public static string Open { get { @@ -6617,7 +6940,7 @@ public static string Open { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open documentation ähnelt. + /// Looks up a localized string similar to Open documentation. /// public static string OpenDocumentation { get { @@ -6626,7 +6949,7 @@ public static string OpenDocumentation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open license ähnelt. + /// Looks up a localized string similar to Open license. /// public static string OpenLicense { get { @@ -6635,7 +6958,7 @@ public static string OpenLicense { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open location ähnelt. + /// Looks up a localized string similar to Open location. /// public static string OpenLocation { get { @@ -6644,7 +6967,7 @@ public static string OpenLocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open OID profiles... ähnelt. + /// Looks up a localized string similar to Open OID profiles.... /// public static string OpenOIDProfilesDots { get { @@ -6653,7 +6976,7 @@ public static string OpenOIDProfilesDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open port profiles... ähnelt. + /// Looks up a localized string similar to Open port profiles.... /// public static string OpenPortProfilesDots { get { @@ -6662,7 +6985,7 @@ public static string OpenPortProfilesDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open project ähnelt. + /// Looks up a localized string similar to Open project. /// public static string OpenProject { get { @@ -6671,7 +6994,7 @@ public static string OpenProject { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open settings ähnelt. + /// Looks up a localized string similar to Open settings. /// public static string OpenSettings { get { @@ -6680,7 +7003,7 @@ public static string OpenSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open settings... ähnelt. + /// Looks up a localized string similar to Open settings.... /// public static string OpenSettingsDots { get { @@ -6689,7 +7012,7 @@ public static string OpenSettingsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open website ähnelt. + /// Looks up a localized string similar to Open website. /// public static string OpenWebsite { get { @@ -6698,7 +7021,7 @@ public static string OpenWebsite { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Orange ähnelt. + /// Looks up a localized string similar to Orange. /// public static string Orange { get { @@ -6707,7 +7030,7 @@ public static string Orange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Organization ähnelt. + /// Looks up a localized string similar to Organization. /// public static string Organization { get { @@ -6716,7 +7039,7 @@ public static string Organization { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OUI ähnelt. + /// Looks up a localized string similar to OUI. /// public static string OUI { get { @@ -6725,7 +7048,16 @@ public static string OUI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die override ähnelt. + /// Looks up a localized string similar to Outbound. + /// + public static string Outbound { + get { + return ResourceManager.GetString("Outbound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to override. /// public static string Override { get { @@ -6734,7 +7066,7 @@ public static string Override { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Override default settings ähnelt. + /// Looks up a localized string similar to Override default settings. /// public static string OverrideDefaultSettings { get { @@ -6743,7 +7075,7 @@ public static string OverrideDefaultSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite ähnelt. + /// Looks up a localized string similar to Overwrite. /// public static string Overwrite { get { @@ -6752,7 +7084,7 @@ public static string Overwrite { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Overwrite? ähnelt. + /// Looks up a localized string similar to Overwrite?. /// public static string OverwriteQuestion { get { @@ -6761,7 +7093,7 @@ public static string OverwriteQuestion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Packet loss ähnelt. + /// Looks up a localized string similar to Packet loss. /// public static string PacketLoss { get { @@ -6770,7 +7102,7 @@ public static string PacketLoss { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Packets transmitted ähnelt. + /// Looks up a localized string similar to Packets transmitted. /// public static string PacketsTransmitted { get { @@ -6779,7 +7111,7 @@ public static string PacketsTransmitted { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Parameter ähnelt. + /// Looks up a localized string similar to Parameter. /// public static string Parameter { get { @@ -6788,7 +7120,7 @@ public static string Parameter { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Password ähnelt. + /// Looks up a localized string similar to Password. /// public static string Password { get { @@ -6797,7 +7129,7 @@ public static string Password { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Passwords do not match! ähnelt. + /// Looks up a localized string similar to Passwords do not match!. /// public static string PasswordsDoNotMatch { get { @@ -6806,7 +7138,7 @@ public static string PasswordsDoNotMatch { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Paste ähnelt. + /// Looks up a localized string similar to Paste. /// public static string Paste { get { @@ -6815,7 +7147,7 @@ public static string Paste { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Patch ähnelt. + /// Looks up a localized string similar to Patch. /// public static string Patch { get { @@ -6824,7 +7156,7 @@ public static string Patch { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Path ähnelt. + /// Looks up a localized string similar to Path. /// public static string Path { get { @@ -6833,7 +7165,7 @@ public static string Path { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pause ähnelt. + /// Looks up a localized string similar to Pause. /// public static string Pause { get { @@ -6842,7 +7174,7 @@ public static string Pause { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Performance ähnelt. + /// Looks up a localized string similar to Performance. /// public static string Performance { get { @@ -6851,7 +7183,7 @@ public static string Performance { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Persistent bitmap caching ähnelt. + /// Looks up a localized string similar to Persistent bitmap caching. /// public static string PersistentBitmapCaching { get { @@ -6860,7 +7192,7 @@ public static string PersistentBitmapCaching { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Petabits ähnelt. + /// Looks up a localized string similar to Petabits. /// public static string Petabits { get { @@ -6869,7 +7201,7 @@ public static string Petabits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Petabytes ähnelt. + /// Looks up a localized string similar to Petabytes. /// public static string Petabytes { get { @@ -6878,7 +7210,7 @@ public static string Petabytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Phy kind ähnelt. + /// Looks up a localized string similar to Phy kind. /// public static string PhyKind { get { @@ -6887,7 +7219,7 @@ public static string PhyKind { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PhysicalAddress ähnelt. + /// Looks up a localized string similar to PhysicalAddress. /// public static string PhysicalAddress { get { @@ -6896,7 +7228,7 @@ public static string PhysicalAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping ähnelt. + /// Looks up a localized string similar to Ping. /// public static string Ping { get { @@ -6905,7 +7237,7 @@ public static string Ping { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping details ähnelt. + /// Looks up a localized string similar to Ping details. /// public static string PingDetails { get { @@ -6914,7 +7246,7 @@ public static string PingDetails { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping Monitor ähnelt. + /// Looks up a localized string similar to Ping Monitor. /// public static string PingMonitor { get { @@ -6923,7 +7255,7 @@ public static string PingMonitor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ping status ähnelt. + /// Looks up a localized string similar to Ping status. /// public static string PingStatus { get { @@ -6932,7 +7264,7 @@ public static string PingStatus { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pink ähnelt. + /// Looks up a localized string similar to Pink. /// public static string Pink { get { @@ -6941,7 +7273,25 @@ public static string Pink { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port ähnelt. + /// Looks up a localized string similar to Character ‘|’ is not allowed.. + /// + public static string PipeNotAllowed { + get { + return ResourceManager.GetString("PipeNotAllowed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Character ‘|’ is not allowed while Firewall profile is enabled.. + /// + public static string PipeNotAllowedWhenFirewallEnabled { + get { + return ResourceManager.GetString("PipeNotAllowedWhenFirewallEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port. /// public static string Port { get { @@ -6950,7 +7300,7 @@ public static string Port { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Portable ähnelt. + /// Looks up a localized string similar to Portable. /// public static string Portable { get { @@ -6959,7 +7309,7 @@ public static string Portable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port description ähnelt. + /// Looks up a localized string similar to Port description. /// public static string PortDescription { get { @@ -6968,7 +7318,7 @@ public static string PortDescription { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port or service ähnelt. + /// Looks up a localized string similar to Port or service. /// public static string PortOrService { get { @@ -6977,7 +7327,7 @@ public static string PortOrService { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port profiles ähnelt. + /// Looks up a localized string similar to Port profiles. /// public static string PortProfiles { get { @@ -6986,7 +7336,7 @@ public static string PortProfiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ports ähnelt. + /// Looks up a localized string similar to Ports. /// public static string Ports { get { @@ -6995,7 +7345,7 @@ public static string Ports { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port scan is disabled! ähnelt. + /// Looks up a localized string similar to Port scan is disabled!. /// public static string PortScanIsDisabled { get { @@ -7004,7 +7354,7 @@ public static string PortScanIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port Scanner ähnelt. + /// Looks up a localized string similar to Port Scanner. /// public static string PortScanner { get { @@ -7013,7 +7363,7 @@ public static string PortScanner { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to Closed. /// public static string PortState_Closed { get { @@ -7022,7 +7372,7 @@ public static string PortState_Closed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open ähnelt. + /// Looks up a localized string similar to Open. /// public static string PortState_Open { get { @@ -7031,7 +7381,7 @@ public static string PortState_Open { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timed out ähnelt. + /// Looks up a localized string similar to Timed out. /// public static string PortState_TimedOut { get { @@ -7040,7 +7390,7 @@ public static string PortState_TimedOut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Port status ähnelt. + /// Looks up a localized string similar to Port status. /// public static string PortStatus { get { @@ -7049,7 +7399,7 @@ public static string PortStatus { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell ähnelt. + /// Looks up a localized string similar to PowerShell. /// public static string PowerShell { get { @@ -7058,7 +7408,7 @@ public static string PowerShell { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance ähnelt. + /// Looks up a localized string similar to The color of the PowerShell console can be changed to the application theme under Settings > General > Appearance. /// public static string PowerShellConsoleColorCanBeChangedUnderSettingsGeneralApperance { get { @@ -7067,7 +7417,7 @@ public static string PowerShellConsoleColorCanBeChangedUnderSettingsGeneralApper } /// - /// Sucht eine lokalisierte Zeichenfolge, die PowerShell process has ended! ähnelt. + /// Looks up a localized string similar to PowerShell process has ended!. /// public static string PowerShellProcessHasEnded { get { @@ -7076,7 +7426,7 @@ public static string PowerShellProcessHasEnded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Preferred protocol when resolving hostname: ähnelt. + /// Looks up a localized string similar to Preferred protocol when resolving hostname:. /// public static string PreferredProtocolWhenResolvingHostname { get { @@ -7085,7 +7435,7 @@ public static string PreferredProtocolWhenResolvingHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Pre-shared key ähnelt. + /// Looks up a localized string similar to Pre-shared key. /// public static string PreSharedKey { get { @@ -7094,7 +7444,7 @@ public static string PreSharedKey { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Preview ähnelt. + /// Looks up a localized string similar to Preview. /// public static string Preview { get { @@ -7103,7 +7453,7 @@ public static string Preview { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Primary DNS server ähnelt. + /// Looks up a localized string similar to Primary DNS server. /// public static string PrimaryDNSServer { get { @@ -7112,7 +7462,7 @@ public static string PrimaryDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Priv ähnelt. + /// Looks up a localized string similar to Priv. /// public static string Priv { get { @@ -7121,7 +7471,7 @@ public static string Priv { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Privacy ähnelt. + /// Looks up a localized string similar to Privacy. /// public static string Privacy { get { @@ -7130,7 +7480,25 @@ public static string Privacy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Private key file ähnelt. + /// Looks up a localized string similar to Private. + /// + public static string Private { + get { + return ResourceManager.GetString("Private", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Prv. + /// + public static string Private_Short3 { + get { + return ResourceManager.GetString("Private_Short3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private key file. /// public static string PrivateKeyFile { get { @@ -7139,7 +7507,7 @@ public static string PrivateKeyFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Process ID ähnelt. + /// Looks up a localized string similar to Process ID. /// public static string ProcessID { get { @@ -7148,7 +7516,7 @@ public static string ProcessID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Process name ähnelt. + /// Looks up a localized string similar to Process name. /// public static string ProcessName { get { @@ -7157,7 +7525,7 @@ public static string ProcessName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Process path ähnelt. + /// Looks up a localized string similar to Process path. /// public static string ProcessPath { get { @@ -7166,7 +7534,7 @@ public static string ProcessPath { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile ähnelt. + /// Looks up a localized string similar to Profile. /// public static string Profile { get { @@ -7175,9 +7543,9 @@ public static string Profile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. + /// Looks up a localized string similar to Profile files are encrypted on disk using AES with a key size of 256 bits and a block size of 128 bits in CBC mode. The encryption key is derived from a master password using Rfc2898DeriveBytes (PBKDF2) with 1,000,000 iterations. At runtime, passwords are stored as SecureString once the profile file is loaded. For some functions, the password must be converted to a normal string and remains unencrypted in memory until the garbage collector cleans them up. /// - ///First make a backup copy of your profile files be [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + ///First make a backup copy of your profile files be [rest of string was truncated]";. /// public static string ProfileEncryptionDisclaimer { get { @@ -7186,7 +7554,7 @@ public static string ProfileEncryptionDisclaimer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile file ähnelt. + /// Looks up a localized string similar to Profile file. /// public static string ProfileFile { get { @@ -7195,7 +7563,7 @@ public static string ProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile file could not be loaded! ähnelt. + /// Looks up a localized string similar to Profile file could not be loaded!. /// public static string ProfileFileCouldNotBeLoaded { get { @@ -7204,13 +7572,13 @@ public static string ProfileFileCouldNotBeLoaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. + /// Looks up a localized string similar to The profile file could not be loaded and may be corrupted. You can try to restore the file from a backup or delete it. /// ///If this happens unexpectedly or after an update, please report the error on GitHub. /// /// ///Error message: - ///"{0}" ähnelt. + ///"{0}". /// public static string ProfileFileCouldNotBeLoadedMessage { get { @@ -7219,7 +7587,7 @@ public static string ProfileFileCouldNotBeLoadedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile files ähnelt. + /// Looks up a localized string similar to Profile files. /// public static string ProfileFiles { get { @@ -7228,7 +7596,7 @@ public static string ProfileFiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Application ähnelt. + /// Looks up a localized string similar to Application. /// public static string ProfileGroup_Application { get { @@ -7237,7 +7605,7 @@ public static string ProfileGroup_Application { } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to General. /// public static string ProfileGroup_General { get { @@ -7246,7 +7614,7 @@ public static string ProfileGroup_General { } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to General. /// public static string ProfileName_General { get { @@ -7255,7 +7623,7 @@ public static string ProfileName_General { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile name already exists! ähnelt. + /// Looks up a localized string similar to Profile name already exists!. /// public static string ProfileNameAlreadyExists { get { @@ -7264,7 +7632,7 @@ public static string ProfileNameAlreadyExists { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles ähnelt. + /// Looks up a localized string similar to Profiles. /// public static string Profiles { get { @@ -7273,7 +7641,7 @@ public static string Profiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles and regions to synchronize ähnelt. + /// Looks up a localized string similar to Profiles and regions to synchronize. /// public static string ProfilesAndRegionsToSync { get { @@ -7282,7 +7650,7 @@ public static string ProfilesAndRegionsToSync { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles reloaded ähnelt. + /// Looks up a localized string similar to Profiles reloaded. /// public static string ProfilesReloaded { get { @@ -7291,7 +7659,7 @@ public static string ProfilesReloaded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A profile with this name already exists! ähnelt. + /// Looks up a localized string similar to A profile with this name already exists!. /// public static string ProfileWithThisNameAlreadyExists { get { @@ -7300,7 +7668,7 @@ public static string ProfileWithThisNameAlreadyExists { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Program ähnelt. + /// Looks up a localized string similar to Program. /// public static string Program { get { @@ -7309,7 +7677,16 @@ public static string Program { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Protocol ähnelt. + /// Looks up a localized string similar to Choose a program that does not exceed 256 characters including path!. + /// + public static string ProgramNameTooLong { + get { + return ResourceManager.GetString("ProgramNameTooLong", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol. /// public static string Protocol { get { @@ -7318,7 +7695,7 @@ public static string Protocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Proxy ähnelt. + /// Looks up a localized string similar to Proxy. /// public static string Proxy { get { @@ -7327,7 +7704,7 @@ public static string Proxy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PTR dns record resolved for "{0}"! ähnelt. + /// Looks up a localized string similar to PTR dns record resolved for "{0}"!. /// public static string PTRDNSRecordResolvedForXXXMessage { get { @@ -7336,7 +7713,7 @@ public static string PTRDNSRecordResolvedForXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PTR record ähnelt. + /// Looks up a localized string similar to PTR record. /// public static string PTRRecord { get { @@ -7345,8 +7722,26 @@ public static string PTRRecord { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IP address check - ///is disabled! ähnelt. + /// Looks up a localized string similar to Public. + /// + public static string Public { + get { + return ResourceManager.GetString("Public", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pub. + /// + public static string Public_Short3 { + get { + return ResourceManager.GetString("Public_Short3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Public IP address check + ///is disabled!. /// public static string PublicIPAddressCheckIsDisabled { get { @@ -7355,7 +7750,7 @@ public static string PublicIPAddressCheckIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv4 address ähnelt. + /// Looks up a localized string similar to Public IPv4 address. /// public static string PublicIPv4Address { get { @@ -7364,7 +7759,7 @@ public static string PublicIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Public IPv6 address ähnelt. + /// Looks up a localized string similar to Public IPv6 address. /// public static string PublicIPv6Address { get { @@ -7373,7 +7768,7 @@ public static string PublicIPv6Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Purple ähnelt. + /// Looks up a localized string similar to Purple. /// public static string Purple { get { @@ -7382,7 +7777,7 @@ public static string Purple { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY ähnelt. + /// Looks up a localized string similar to PuTTY. /// public static string PuTTY { get { @@ -7391,7 +7786,7 @@ public static string PuTTY { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Session log ähnelt. + /// Looks up a localized string similar to Session log. /// public static string PuTTYLogMode_SessionLog { get { @@ -7400,7 +7795,7 @@ public static string PuTTYLogMode_SessionLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH log ähnelt. + /// Looks up a localized string similar to SSH log. /// public static string PuTTYLogMode_SSHLog { get { @@ -7409,7 +7804,7 @@ public static string PuTTYLogMode_SSHLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH and Raw log ähnelt. + /// Looks up a localized string similar to SSH and Raw log. /// public static string PuTTYLogMode_SSHRawLog { get { @@ -7418,7 +7813,7 @@ public static string PuTTYLogMode_SSHRawLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die PuTTY process has ended! ähnelt. + /// Looks up a localized string similar to PuTTY process has ended!. /// public static string PuTTYProcessHasEnded { get { @@ -7427,7 +7822,7 @@ public static string PuTTYProcessHasEnded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Query ähnelt. + /// Looks up a localized string similar to Query. /// public static string Query { get { @@ -7436,7 +7831,7 @@ public static string Query { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Query class ähnelt. + /// Looks up a localized string similar to Query class. /// public static string QueryClass { get { @@ -7445,7 +7840,7 @@ public static string QueryClass { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Questions ähnelt. + /// Looks up a localized string similar to Questions. /// public static string Questions { get { @@ -7454,7 +7849,7 @@ public static string Questions { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rate limit reached! Try again in {0} seconds... ähnelt. + /// Looks up a localized string similar to Rate limit reached! Try again in {0} seconds.... /// public static string RateLimitReachedTryAgainInXSeconds { get { @@ -7463,7 +7858,7 @@ public static string RateLimitReachedTryAgainInXSeconds { } /// - /// Sucht eine lokalisierte Zeichenfolge, die RAW ähnelt. + /// Looks up a localized string similar to RAW. /// public static string RAW { get { @@ -7472,7 +7867,7 @@ public static string RAW { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Received ähnelt. + /// Looks up a localized string similar to Received. /// public static string Received { get { @@ -7481,7 +7876,7 @@ public static string Received { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Received / Lost ähnelt. + /// Looks up a localized string similar to Received / Lost. /// public static string ReceivedLost { get { @@ -7490,7 +7885,7 @@ public static string ReceivedLost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reconnect ähnelt. + /// Looks up a localized string similar to Reconnect. /// public static string Reconnect { get { @@ -7499,7 +7894,7 @@ public static string Reconnect { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reconnect if the connection is dropped ähnelt. + /// Looks up a localized string similar to Reconnect if the connection is dropped. /// public static string ReconnectIfTheConnectionIsDropped { get { @@ -7508,7 +7903,7 @@ public static string ReconnectIfTheConnectionIsDropped { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Recursion ähnelt. + /// Looks up a localized string similar to Recursion. /// public static string Recursion { get { @@ -7517,7 +7912,7 @@ public static string Recursion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Red ähnelt. + /// Looks up a localized string similar to Red. /// public static string Red { get { @@ -7526,7 +7921,7 @@ public static string Red { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect clipboard ähnelt. + /// Looks up a localized string similar to Redirect clipboard. /// public static string RedirectClipboard { get { @@ -7535,7 +7930,7 @@ public static string RedirectClipboard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect devices ähnelt. + /// Looks up a localized string similar to Redirect devices. /// public static string RedirectDevices { get { @@ -7544,7 +7939,7 @@ public static string RedirectDevices { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect drives ähnelt. + /// Looks up a localized string similar to Redirect drives. /// public static string RedirectDrives { get { @@ -7553,7 +7948,7 @@ public static string RedirectDrives { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect ports ähnelt. + /// Looks up a localized string similar to Redirect ports. /// public static string RedirectPorts { get { @@ -7562,7 +7957,7 @@ public static string RedirectPorts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect printers ähnelt. + /// Looks up a localized string similar to Redirect printers. /// public static string RedirectPrinters { get { @@ -7571,7 +7966,7 @@ public static string RedirectPrinters { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Redirect smartcards ähnelt. + /// Looks up a localized string similar to Redirect smartcards. /// public static string RedirectSmartcards { get { @@ -7580,7 +7975,7 @@ public static string RedirectSmartcards { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Refresh ähnelt. + /// Looks up a localized string similar to Refresh. /// public static string Refresh { get { @@ -7589,7 +7984,7 @@ public static string Refresh { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Refreshing... ähnelt. + /// Looks up a localized string similar to Refreshing.... /// public static string RefreshingDots { get { @@ -7598,7 +7993,7 @@ public static string RefreshingDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Region ähnelt. + /// Looks up a localized string similar to Region. /// public static string Region { get { @@ -7607,7 +8002,7 @@ public static string Region { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Release ähnelt. + /// Looks up a localized string similar to Release. /// public static string Release { get { @@ -7616,7 +8011,7 @@ public static string Release { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Release & Renew ähnelt. + /// Looks up a localized string similar to Release & Renew. /// public static string ReleaseRenew { get { @@ -7625,7 +8020,7 @@ public static string ReleaseRenew { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reload ähnelt. + /// Looks up a localized string similar to Reload. /// public static string Reload { get { @@ -7634,7 +8029,7 @@ public static string Reload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reloaded at {0} ähnelt. + /// Looks up a localized string similar to Reloaded at {0}. /// public static string ReloadedAtX { get { @@ -7643,7 +8038,7 @@ public static string ReloadedAtX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remaining time ähnelt. + /// Looks up a localized string similar to Remaining time. /// public static string RemainingTime { get { @@ -7652,7 +8047,16 @@ public static string RemainingTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio ähnelt. + /// Looks up a localized string similar to Remote access. + /// + public static string RemoteAccess { + get { + return ResourceManager.GetString("RemoteAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remote audio. /// public static string RemoteAudio { get { @@ -7661,7 +8065,7 @@ public static string RemoteAudio { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio playback ähnelt. + /// Looks up a localized string similar to Remote audio playback. /// public static string RemoteAudioPlayback { get { @@ -7670,7 +8074,7 @@ public static string RemoteAudioPlayback { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote audio recording ähnelt. + /// Looks up a localized string similar to Remote audio recording. /// public static string RemoteAudioRecording { get { @@ -7679,7 +8083,7 @@ public static string RemoteAudioRecording { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote console ähnelt. + /// Looks up a localized string similar to Remote console. /// public static string RemoteConsole { get { @@ -7688,7 +8092,7 @@ public static string RemoteConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop ähnelt. + /// Looks up a localized string similar to Remote Desktop. /// public static string RemoteDesktop { get { @@ -7697,7 +8101,7 @@ public static string RemoteDesktop { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Do not record ähnelt. + /// Looks up a localized string similar to Do not record. /// public static string RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord { get { @@ -7706,7 +8110,7 @@ public static string RemoteDesktopAudioCaptureRedirectionMode_DoNotRecord { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Record from this computer ähnelt. + /// Looks up a localized string similar to Record from this computer. /// public static string RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComputer { get { @@ -7715,7 +8119,7 @@ public static string RemoteDesktopAudioCaptureRedirectionMode_RecordFromThisComp } /// - /// Sucht eine lokalisierte Zeichenfolge, die Do not play ähnelt. + /// Looks up a localized string similar to Do not play. /// public static string RemoteDesktopAudioRedirectionMode_DoNotPlay { get { @@ -7724,7 +8128,7 @@ public static string RemoteDesktopAudioRedirectionMode_DoNotPlay { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Play on remote computer ähnelt. + /// Looks up a localized string similar to Play on remote computer. /// public static string RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer { get { @@ -7733,7 +8137,7 @@ public static string RemoteDesktopAudioRedirectionMode_PlayOnRemoteComputer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Play on this computer ähnelt. + /// Looks up a localized string similar to Play on this computer. /// public static string RemoteDesktopAudioRedirectionMode_PlayOnThisComputer { get { @@ -7742,7 +8146,7 @@ public static string RemoteDesktopAudioRedirectionMode_PlayOnThisComputer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer due to one of the following reasons: 1) The requested Remote Desktop Gateway server address and the server SSL certificate subject name do not match. 2) The certificate is expired or revoked. 3) The certificate root authority does not trust the certificate. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331651 { get { @@ -7751,7 +8155,7 @@ public static string RemoteDesktopDisconnectReason_50331651 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to This computer can't verify the identity of the RD Gateway "". It's not safe to connect to servers that can't be identified. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331653 { get { @@ -7760,7 +8164,7 @@ public static string RemoteDesktopDisconnectReason_50331653 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server address requested and the certificate subject name do not match. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331654 { get { @@ -7769,7 +8173,7 @@ public static string RemoteDesktopDisconnectReason_50331654 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server's certificate has expired or has been revoked. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331655 { get { @@ -7778,7 +8182,7 @@ public static string RemoteDesktopDisconnectReason_50331655 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to An error occurred while sending data to the Remote Desktop Gateway server. The server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331657 { get { @@ -7787,7 +8191,7 @@ public static string RemoteDesktopDisconnectReason_50331657 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to An error occurred while receiving data from the Remote Desktop Gateway server. Either the server is temporarily unavailable or a network connection is down. Try again later, or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331658 { get { @@ -7796,7 +8200,7 @@ public static string RemoteDesktopDisconnectReason_50331658 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server address is unreachable or incorrect. Type a valid Remote Desktop Gateway server address.. /// public static string RemoteDesktopDisconnectReason_50331660 { get { @@ -7805,7 +8209,7 @@ public static string RemoteDesktopDisconnectReason_50331660 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331661 { get { @@ -7814,7 +8218,7 @@ public static string RemoteDesktopDisconnectReason_50331661 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is running low on server resources and is temporarily unavailable. Try reconnecting later or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331663 { get { @@ -7823,7 +8227,7 @@ public static string RemoteDesktopDisconnectReason_50331663 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to The Remote Desktop Gateway server has ended the connection. Try reconnecting later or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331672 { get { @@ -7832,7 +8236,7 @@ public static string RemoteDesktopDisconnectReason_50331672 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to The Remote Desktop Gateway server administrator has ended the connection. Try reconnecting later or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331673 { get { @@ -7841,7 +8245,7 @@ public static string RemoteDesktopDisconnectReason_50331673 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not listed in the RD Gateway's permission list 2) You might have specified the remote computer in NetBIOS format (for example, computer1), but the RD Gateway is expecting an FQDN or IP address format (for example, computer1.fabrikam.com or 157.60.0.1). Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331675 { get { @@ -7850,7 +8254,7 @@ public static string RemoteDesktopDisconnectReason_50331675 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Remote Desktop can't connect to the remote computer "" for one of these reasons: 1) Your user account is not authorized to access the RD Gateway "" 2) Your computer is not authorized to access the RD Gateway "" 3) You are using an incompatible authentication method (for example, the RD Gateway might be expecting a smart card but you provided a password) Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331676 { get { @@ -7859,7 +8263,7 @@ public static string RemoteDesktopDisconnectReason_50331676 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because your network administrator has restricted access to this RD Gateway server. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331679 { get { @@ -7868,7 +8272,7 @@ public static string RemoteDesktopDisconnectReason_50331679 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the web proxy server requires authentication. To allow unauthenticated traffic to an RD Gateway server through your web proxy server, contact your network administrator.. /// public static string RemoteDesktopDisconnectReason_50331680 { get { @@ -7877,7 +8281,7 @@ public static string RemoteDesktopDisconnectReason_50331680 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server reached its maximum allowed connections. Try reconnecting later or contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331682 { get { @@ -7886,7 +8290,7 @@ public static string RemoteDesktopDisconnectReason_50331682 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server does not support the request. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331683 { get { @@ -7895,7 +8299,7 @@ public static string RemoteDesktopDisconnectReason_50331683 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the client does not support one of the Remote Desktop Gateway's capabilities. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331684 { get { @@ -7904,7 +8308,7 @@ public static string RemoteDesktopDisconnectReason_50331684 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server and this computer are incompatible. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331685 { get { @@ -7913,7 +8317,7 @@ public static string RemoteDesktopDisconnectReason_50331685 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because no certificate was configured to use at the Remote Desktop Gateway server. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331688 { get { @@ -7922,7 +8326,7 @@ public static string RemoteDesktopDisconnectReason_50331688 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the RD Gateway server that you are trying to connect to is not allowed by your computer administrator. If you are the administrator, add this Remote Desktop Gateway server name to the trusted Remote Desktop Gateway server list on your computer and then try connecting again.. /// public static string RemoteDesktopDisconnectReason_50331689 { get { @@ -7931,7 +8335,7 @@ public static string RemoteDesktopDisconnectReason_50331689 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your comput [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because your computer or device did not meet the Network Access Protection requirements set by your network administrator, for one of the following reasons: 1) The Remote Desktop Gateway server name and the server's public key certificate subject name do not match. 2) The certificate has expired or has been revoked. 3) The certificate root authority does not trust the certificate. 4) The certificate key extension does not support encryption. 5) Your comput [rest of string was truncated]";. /// public static string RemoteDesktopDisconnectReason_50331690 { get { @@ -7940,7 +8344,7 @@ public static string RemoteDesktopDisconnectReason_50331690 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because a user name and password are required to authenticate to the Remote Desktop Gateway server instead of smart card credentials.. /// public static string RemoteDesktopDisconnectReason_50331691 { get { @@ -7949,7 +8353,7 @@ public static string RemoteDesktopDisconnectReason_50331691 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because smart card credentials are required to authenticate to the Remote Desktop Gateway server instead of a user name and password.. /// public static string RemoteDesktopDisconnectReason_50331692 { get { @@ -7958,7 +8362,7 @@ public static string RemoteDesktopDisconnectReason_50331692 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because an invalid cookie was sent to the Remote Desktop Gateway server. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331700 { get { @@ -7967,7 +8371,7 @@ public static string RemoteDesktopDisconnectReason_50331700 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the cookie was rejected by the Remote Desktop Gateway server. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331701 { get { @@ -7976,7 +8380,7 @@ public static string RemoteDesktopDisconnectReason_50331701 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway server is expecting an authentication method different from the one attempted. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331703 { get { @@ -7985,7 +8389,7 @@ public static string RemoteDesktopDisconnectReason_50331703 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. ähnelt. + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authentication failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance.. /// public static string RemoteDesktopDisconnectReason_50331704 { get { @@ -7994,7 +8398,7 @@ public static string RemoteDesktopDisconnectReason_50331704 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance. ähnelt. + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authorization failed. Try reconnecting with a correct user name and password. If the reconnection fails, contact your network administrator for further assistance.. /// public static string RemoteDesktopDisconnectReason_50331705 { get { @@ -8003,7 +8407,7 @@ public static string RemoteDesktopDisconnectReason_50331705 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistanc [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt. + /// Looks up a localized string similar to Your computer can't connect to the remote computer because the Remote Desktop Gateway and the remote computer are unable to exchange policies. This could happen due to one of the following reasons: 1. The remote computer is not capable of exchanging policies with the Remote Desktop Gateway. 2. The remote computer's configuration does not permit a new connection. 3. The connection between the Remote Desktop Gateway and the remote computer ended. Contact your network administrator for assistanc [rest of string was truncated]";. /// public static string RemoteDesktopDisconnectReason_50331707 { get { @@ -8012,7 +8416,7 @@ public static string RemoteDesktopDisconnectReason_50331707 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance. ähnelt. + /// Looks up a localized string similar to The RD Gateway connection ended because periodic user authorization failed. Your computer or device didn't pass the Network Access Protection (NAP) requirements set by your network administrator. Contact your network administrator for assistance.. /// public static string RemoteDesktopDisconnectReason_50331713 { get { @@ -8021,7 +8425,7 @@ public static string RemoteDesktopDisconnectReason_50331713 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Socket closed. ähnelt. + /// Looks up a localized string similar to Socket closed.. /// public static string RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE { get { @@ -8030,7 +8434,7 @@ public static string RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote disconnect by server. ähnelt. + /// Looks up a localized string similar to Remote disconnect by server.. /// public static string RemoteDesktopDisconnectReason_ByServer { get { @@ -8039,7 +8443,7 @@ public static string RemoteDesktopDisconnectReason_ByServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decompression error. ähnelt. + /// Looks up a localized string similar to Decompression error.. /// public static string RemoteDesktopDisconnectReason_ClientDecompressionError { get { @@ -8048,7 +8452,7 @@ public static string RemoteDesktopDisconnectReason_ClientDecompressionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connection timed out. ähnelt. + /// Looks up a localized string similar to Connection timed out.. /// public static string RemoteDesktopDisconnectReason_ConnectionTimedOut { get { @@ -8057,7 +8461,7 @@ public static string RemoteDesktopDisconnectReason_ConnectionTimedOut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Decryption error. ähnelt. + /// Looks up a localized string similar to Decryption error.. /// public static string RemoteDesktopDisconnectReason_DecryptionError { get { @@ -8066,7 +8470,7 @@ public static string RemoteDesktopDisconnectReason_DecryptionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS name lookup failure. ähnelt. + /// Looks up a localized string similar to DNS name lookup failure.. /// public static string RemoteDesktopDisconnectReason_DNSLookupFailed { get { @@ -8075,7 +8479,7 @@ public static string RemoteDesktopDisconnectReason_DNSLookupFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DNS lookup failed. ähnelt. + /// Looks up a localized string similar to DNS lookup failed.. /// public static string RemoteDesktopDisconnectReason_DNSLookupFailed2 { get { @@ -8084,7 +8488,7 @@ public static string RemoteDesktopDisconnectReason_DNSLookupFailed2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Encryption error. ähnelt. + /// Looks up a localized string similar to Encryption error.. /// public static string RemoteDesktopDisconnectReason_EncryptionError { get { @@ -8093,7 +8497,7 @@ public static string RemoteDesktopDisconnectReason_EncryptionError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets gethostbyname call failed. ähnelt. + /// Looks up a localized string similar to Windows Sockets gethostbyname call failed.. /// public static string RemoteDesktopDisconnectReason_GetHostByNameFailed { get { @@ -8102,7 +8506,7 @@ public static string RemoteDesktopDisconnectReason_GetHostByNameFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Host not found. ähnelt. + /// Looks up a localized string similar to Host not found.. /// public static string RemoteDesktopDisconnectReason_HostNotFound { get { @@ -8111,7 +8515,7 @@ public static string RemoteDesktopDisconnectReason_HostNotFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal error. ähnelt. + /// Looks up a localized string similar to Internal error.. /// public static string RemoteDesktopDisconnectReason_InternalError { get { @@ -8120,7 +8524,7 @@ public static string RemoteDesktopDisconnectReason_InternalError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal security error. ähnelt. + /// Looks up a localized string similar to Internal security error.. /// public static string RemoteDesktopDisconnectReason_InternalSecurityError { get { @@ -8129,7 +8533,7 @@ public static string RemoteDesktopDisconnectReason_InternalSecurityError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal security error. ähnelt. + /// Looks up a localized string similar to Internal security error.. /// public static string RemoteDesktopDisconnectReason_InternalSecurityError2 { get { @@ -8138,7 +8542,7 @@ public static string RemoteDesktopDisconnectReason_InternalSecurityError2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The encryption method specified is not valid. ähnelt. + /// Looks up a localized string similar to The encryption method specified is not valid.. /// public static string RemoteDesktopDisconnectReason_InvalidEncryption { get { @@ -8147,7 +8551,7 @@ public static string RemoteDesktopDisconnectReason_InvalidEncryption { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Bad IP address specified. ähnelt. + /// Looks up a localized string similar to Bad IP address specified.. /// public static string RemoteDesktopDisconnectReason_InvalidIP { get { @@ -8156,7 +8560,7 @@ public static string RemoteDesktopDisconnectReason_InvalidIP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The IP address specified is not valid. ähnelt. + /// Looks up a localized string similar to The IP address specified is not valid.. /// public static string RemoteDesktopDisconnectReason_InvalidIPAddr { get { @@ -8165,7 +8569,7 @@ public static string RemoteDesktopDisconnectReason_InvalidIPAddr { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Security data is not valid. ähnelt. + /// Looks up a localized string similar to Security data is not valid.. /// public static string RemoteDesktopDisconnectReason_InvalidSecurityData { get { @@ -8174,7 +8578,7 @@ public static string RemoteDesktopDisconnectReason_InvalidSecurityData { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Server security data is not valid. ähnelt. + /// Looks up a localized string similar to Server security data is not valid.. /// public static string RemoteDesktopDisconnectReason_InvalidServerSecurityInfo { get { @@ -8183,7 +8587,7 @@ public static string RemoteDesktopDisconnectReason_InvalidServerSecurityInfo { } /// - /// Sucht eine lokalisierte Zeichenfolge, die License negotiation failed. ähnelt. + /// Looks up a localized string similar to License negotiation failed.. /// public static string RemoteDesktopDisconnectReason_LicensingFailed { get { @@ -8192,7 +8596,7 @@ public static string RemoteDesktopDisconnectReason_LicensingFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Licensing time-out. ähnelt. + /// Looks up a localized string similar to Licensing time-out.. /// public static string RemoteDesktopDisconnectReason_LicensingTimeout { get { @@ -8201,7 +8605,7 @@ public static string RemoteDesktopDisconnectReason_LicensingTimeout { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Local disconnection. ähnelt. + /// Looks up a localized string similar to Local disconnection.. /// public static string RemoteDesktopDisconnectReason_LocalNotError { get { @@ -8210,7 +8614,7 @@ public static string RemoteDesktopDisconnectReason_LocalNotError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No information is available. ähnelt. + /// Looks up a localized string similar to No information is available.. /// public static string RemoteDesktopDisconnectReason_NoInfo { get { @@ -8219,7 +8623,7 @@ public static string RemoteDesktopDisconnectReason_NoInfo { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Out of memory.. /// public static string RemoteDesktopDisconnectReason_OutOfMemory { get { @@ -8228,7 +8632,7 @@ public static string RemoteDesktopDisconnectReason_OutOfMemory { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Out of memory.. /// public static string RemoteDesktopDisconnectReason_OutOfMemory2 { get { @@ -8237,7 +8641,7 @@ public static string RemoteDesktopDisconnectReason_OutOfMemory2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Out of memory. ähnelt. + /// Looks up a localized string similar to Out of memory.. /// public static string RemoteDesktopDisconnectReason_OutOfMemory3 { get { @@ -8246,7 +8650,7 @@ public static string RemoteDesktopDisconnectReason_OutOfMemory3 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote disconnect by user. ähnelt. + /// Looks up a localized string similar to Remote disconnect by user.. /// public static string RemoteDesktopDisconnectReason_RemoteByUser { get { @@ -8255,7 +8659,7 @@ public static string RemoteDesktopDisconnectReason_RemoteByUser { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Failed to unpack server certificate. ähnelt. + /// Looks up a localized string similar to Failed to unpack server certificate.. /// public static string RemoteDesktopDisconnectReason_ServerCertificateUnpackErr { get { @@ -8264,7 +8668,7 @@ public static string RemoteDesktopDisconnectReason_ServerCertificateUnpackErr { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets connect failed. ähnelt. + /// Looks up a localized string similar to Windows Sockets connect failed.. /// public static string RemoteDesktopDisconnectReason_SocketConnectFailed { get { @@ -8273,7 +8677,7 @@ public static string RemoteDesktopDisconnectReason_SocketConnectFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets recv call failed. ähnelt. + /// Looks up a localized string similar to Windows Sockets recv call failed.. /// public static string RemoteDesktopDisconnectReason_SocketRecvFailed { get { @@ -8282,7 +8686,7 @@ public static string RemoteDesktopDisconnectReason_SocketRecvFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is disabled. ähnelt. + /// Looks up a localized string similar to The account is disabled.. /// public static string RemoteDesktopDisconnectReason_SslErrAccountDisabled { get { @@ -8291,7 +8695,7 @@ public static string RemoteDesktopDisconnectReason_SslErrAccountDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is expired. ähnelt. + /// Looks up a localized string similar to The account is expired.. /// public static string RemoteDesktopDisconnectReason_SslErrAccountExpired { get { @@ -8300,7 +8704,7 @@ public static string RemoteDesktopDisconnectReason_SslErrAccountExpired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is locked out. ähnelt. + /// Looks up a localized string similar to The account is locked out.. /// public static string RemoteDesktopDisconnectReason_SslErrAccountLockedOut { get { @@ -8309,7 +8713,7 @@ public static string RemoteDesktopDisconnectReason_SslErrAccountLockedOut { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The account is restricted. ähnelt. + /// Looks up a localized string similar to The account is restricted.. /// public static string RemoteDesktopDisconnectReason_SslErrAccountRestriction { get { @@ -8318,7 +8722,7 @@ public static string RemoteDesktopDisconnectReason_SslErrAccountRestriction { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The received certificate is expired. ähnelt. + /// Looks up a localized string similar to The received certificate is expired.. /// public static string RemoteDesktopDisconnectReason_SslErrCertExpired { get { @@ -8327,7 +8731,7 @@ public static string RemoteDesktopDisconnectReason_SslErrCertExpired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The policy does not support delegation of credentials to the target server. ähnelt. + /// Looks up a localized string similar to The policy does not support delegation of credentials to the target server.. /// public static string RemoteDesktopDisconnectReason_SslErrDelegationPolicy { get { @@ -8336,7 +8740,7 @@ public static string RemoteDesktopDisconnectReason_SslErrDelegationPolicy { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials. ähnelt. + /// Looks up a localized string similar to The server authentication policy does not allow connection requests using saved credentials. The user must enter new credentials.. /// public static string RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer { get { @@ -8345,7 +8749,7 @@ public static string RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServ } /// - /// Sucht eine lokalisierte Zeichenfolge, die Login failed. ähnelt. + /// Looks up a localized string similar to Login failed.. /// public static string RemoteDesktopDisconnectReason_SslErrLogonFailure { get { @@ -8354,7 +8758,7 @@ public static string RemoteDesktopDisconnectReason_SslErrLogonFailure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure. ähnelt. + /// Looks up a localized string similar to No authority could be contacted for authentication. The domain name of the authenticating party could be wrong, the domain could be unreachable, or there might have been a trust relationship failure.. /// public static string RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority { get { @@ -8363,7 +8767,7 @@ public static string RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthori } /// - /// Sucht eine lokalisierte Zeichenfolge, die The specified user has no account. ähnelt. + /// Looks up a localized string similar to The specified user has no account.. /// public static string RemoteDesktopDisconnectReason_SslErrNoSuchUser { get { @@ -8372,7 +8776,7 @@ public static string RemoteDesktopDisconnectReason_SslErrNoSuchUser { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The password is expired. ähnelt. + /// Looks up a localized string similar to The password is expired.. /// public static string RemoteDesktopDisconnectReason_SslErrPasswordExpired { get { @@ -8381,7 +8785,7 @@ public static string RemoteDesktopDisconnectReason_SslErrPasswordExpired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The user password must be changed before logging on for the first time. ähnelt. + /// Looks up a localized string similar to The user password must be changed before logging on for the first time.. /// public static string RemoteDesktopDisconnectReason_SslErrPasswordMustChange { get { @@ -8390,7 +8794,7 @@ public static string RemoteDesktopDisconnectReason_SslErrPasswordMustChange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved. ähnelt. + /// Looks up a localized string similar to Delegation of credentials to the target server is not allowed unless mutual authentication has been achieved.. /// public static string RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly { get { @@ -8399,7 +8803,7 @@ public static string RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The smart card is blocked. ähnelt. + /// Looks up a localized string similar to The smart card is blocked.. /// public static string RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked { get { @@ -8408,7 +8812,7 @@ public static string RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An incorrect PIN was presented to the smart card. ähnelt. + /// Looks up a localized string similar to An incorrect PIN was presented to the smart card.. /// public static string RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN { get { @@ -8417,7 +8821,7 @@ public static string RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout occurred. ähnelt. + /// Looks up a localized string similar to Timeout occurred.. /// public static string RemoteDesktopDisconnectReason_TimeoutOccurred { get { @@ -8426,7 +8830,7 @@ public static string RemoteDesktopDisconnectReason_TimeoutOccurred { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Internal timer error. ähnelt. + /// Looks up a localized string similar to Internal timer error.. /// public static string RemoteDesktopDisconnectReason_TimerError { get { @@ -8435,7 +8839,7 @@ public static string RemoteDesktopDisconnectReason_TimerError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies. ähnelt. + /// Looks up a localized string similar to The remote session ended because the total login time limit was reached. This limit is set by the server administrator or by network policies.. /// public static string RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached { get { @@ -8444,7 +8848,7 @@ public static string RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unable to reconnect to the remote session. ähnelt. + /// Looks up a localized string similar to Unable to reconnect to the remote session.. /// public static string RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession { get { @@ -8453,7 +8857,7 @@ public static string RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSess } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows Sockets send call failed. ähnelt. + /// Looks up a localized string similar to Windows Sockets send call failed.. /// public static string RemoteDesktopDisconnectReason_WinsockSendFailed { get { @@ -8462,7 +8866,7 @@ public static string RemoteDesktopDisconnectReason_WinsockSendFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Allow me to select later ähnelt. + /// Looks up a localized string similar to Allow me to select later. /// public static string RemoteDesktopGatewayServerLogonMethod_Any { get { @@ -8471,7 +8875,7 @@ public static string RemoteDesktopGatewayServerLogonMethod_Any { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Smart card or Windows Hello for Business ähnelt. + /// Looks up a localized string similar to Smart card or Windows Hello for Business. /// public static string RemoteDesktopGatewayServerLogonMethod_Smartcard { get { @@ -8480,7 +8884,7 @@ public static string RemoteDesktopGatewayServerLogonMethod_Smartcard { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Ask for password (NTLM) ähnelt. + /// Looks up a localized string similar to Ask for password (NTLM). /// public static string RemoteDesktopGatewayServerLogonMethod_Userpass { get { @@ -8489,7 +8893,7 @@ public static string RemoteDesktopGatewayServerLogonMethod_Userpass { } /// - /// Sucht eine lokalisierte Zeichenfolge, die On the remote computer ähnelt. + /// Looks up a localized string similar to On the remote computer. /// public static string RemoteDesktopKeyboardHookMode_OnTheRemoteComputer { get { @@ -8498,7 +8902,7 @@ public static string RemoteDesktopKeyboardHookMode_OnTheRemoteComputer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die On this computer ähnelt. + /// Looks up a localized string similar to On this computer. /// public static string RemoteDesktopKeyboardHookMode_OnThisComputer { get { @@ -8507,7 +8911,7 @@ public static string RemoteDesktopKeyboardHookMode_OnThisComputer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die High-speed broadband (2 Mbps - 10 Mbps) ähnelt. + /// Looks up a localized string similar to High-speed broadband (2 Mbps - 10 Mbps). /// public static string RemoteDesktopNetworkConnectionType_BroadbandHigh { get { @@ -8516,7 +8920,7 @@ public static string RemoteDesktopNetworkConnectionType_BroadbandHigh { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Low-speed broadband (256 kbps - 2 Mbps) ähnelt. + /// Looks up a localized string similar to Low-speed broadband (256 kbps - 2 Mbps). /// public static string RemoteDesktopNetworkConnectionType_BroadbandLow { get { @@ -8525,7 +8929,7 @@ public static string RemoteDesktopNetworkConnectionType_BroadbandLow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Detect connection quality automatically ähnelt. + /// Looks up a localized string similar to Detect connection quality automatically. /// public static string RemoteDesktopNetworkConnectionType_DetectAutomatically { get { @@ -8534,7 +8938,7 @@ public static string RemoteDesktopNetworkConnectionType_DetectAutomatically { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LAN (10 Mbps or higher) ähnelt. + /// Looks up a localized string similar to LAN (10 Mbps or higher). /// public static string RemoteDesktopNetworkConnectionType_LAN { get { @@ -8543,7 +8947,7 @@ public static string RemoteDesktopNetworkConnectionType_LAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Modem (56 kbps) ähnelt. + /// Looks up a localized string similar to Modem (56 kbps). /// public static string RemoteDesktopNetworkConnectionType_Modem { get { @@ -8552,7 +8956,7 @@ public static string RemoteDesktopNetworkConnectionType_Modem { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Satellite (2 Mbps - 16 Mbps with high latency) ähnelt. + /// Looks up a localized string similar to Satellite (2 Mbps - 16 Mbps with high latency). /// public static string RemoteDesktopNetworkConnectionType_Satellite { get { @@ -8561,7 +8965,7 @@ public static string RemoteDesktopNetworkConnectionType_Satellite { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WAN (10 Mbps or higher with high latency) ähnelt. + /// Looks up a localized string similar to WAN (10 Mbps or higher with high latency). /// public static string RemoteDesktopNetworkConnectionType_WAN { get { @@ -8570,7 +8974,7 @@ public static string RemoteDesktopNetworkConnectionType_WAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote hostname ähnelt. + /// Looks up a localized string similar to Remote hostname. /// public static string RemoteHostname { get { @@ -8579,7 +8983,7 @@ public static string RemoteHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote IP address ähnelt. + /// Looks up a localized string similar to Remote IP address. /// public static string RemoteIPAddress { get { @@ -8588,7 +8992,7 @@ public static string RemoteIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remote port ähnelt. + /// Looks up a localized string similar to Remote port. /// public static string RemotePort { get { @@ -8597,7 +9001,16 @@ public static string RemotePort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remove IPv4 address ähnelt. + /// Looks up a localized string similar to Remote ports. + /// + public static string RemotePorts { + get { + return ResourceManager.GetString("RemotePorts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove IPv4 address. /// public static string RemoveIPv4Address { get { @@ -8606,7 +9019,7 @@ public static string RemoveIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Remove IPv4 address... ähnelt. + /// Looks up a localized string similar to Remove IPv4 address.... /// public static string RemoveIPv4AddressDots { get { @@ -8615,7 +9028,7 @@ public static string RemoveIPv4AddressDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rename ähnelt. + /// Looks up a localized string similar to Rename. /// public static string Rename { get { @@ -8624,7 +9037,7 @@ public static string Rename { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Renew ähnelt. + /// Looks up a localized string similar to Renew. /// public static string Renew { get { @@ -8633,7 +9046,7 @@ public static string Renew { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Repeat ähnelt. + /// Looks up a localized string similar to Repeat. /// public static string Repeat { get { @@ -8642,7 +9055,7 @@ public static string Repeat { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Report on GitHub ähnelt. + /// Looks up a localized string similar to Report on GitHub. /// public static string ReportOnGitHub { get { @@ -8651,7 +9064,7 @@ public static string ReportOnGitHub { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reset ähnelt. + /// Looks up a localized string similar to Reset. /// public static string Reset { get { @@ -8660,7 +9073,7 @@ public static string Reset { } /// - /// Sucht eine lokalisierte Zeichenfolge, die All profiles in this profile file will be permanently deleted! ähnelt. + /// Looks up a localized string similar to All profiles in this profile file will be permanently deleted!. /// public static string ResetProfilesMessage { get { @@ -8669,7 +9082,7 @@ public static string ResetProfilesMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Reset settings? ähnelt. + /// Looks up a localized string similar to Reset settings?. /// public static string ResetSettingsQuestion { get { @@ -8678,7 +9091,7 @@ public static string ResetSettingsQuestion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resize ähnelt. + /// Looks up a localized string similar to Resize. /// public static string Resize { get { @@ -8687,7 +9100,7 @@ public static string Resize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve CNAME on ANY requests ähnelt. + /// Looks up a localized string similar to Resolve CNAME on ANY requests. /// public static string ResolveCNAMEOnANYRequests { get { @@ -8696,7 +9109,7 @@ public static string ResolveCNAMEOnANYRequests { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolved "{0}" as hostname for ip address "{1}"! ähnelt. + /// Looks up a localized string similar to Resolved "{0}" as hostname for ip address "{1}"!. /// public static string ResolvedXXXAsHostnameForIPAddressXXXMessage { get { @@ -8705,7 +9118,7 @@ public static string ResolvedXXXAsHostnameForIPAddressXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve hostname ähnelt. + /// Looks up a localized string similar to Resolve hostname. /// public static string ResolveHostname { get { @@ -8714,7 +9127,7 @@ public static string ResolveHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve Hostname is disabled! ähnelt. + /// Looks up a localized string similar to Resolve Hostname is disabled!. /// public static string ResolveHostnameIsDisabled { get { @@ -8723,7 +9136,7 @@ public static string ResolveHostnameIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve IP address for this host (IPv4 is preferred) ähnelt. + /// Looks up a localized string similar to Resolve IP address for this host (IPv4 is preferred). /// public static string ResolveIPAddressForThisHost { get { @@ -8732,7 +9145,7 @@ public static string ResolveIPAddressForThisHost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve IPv4 address for this host ähnelt. + /// Looks up a localized string similar to Resolve IPv4 address for this host. /// public static string ResolveIPv4AddressForThisHost { get { @@ -8741,7 +9154,7 @@ public static string ResolveIPv4AddressForThisHost { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve MAC address and vendor ähnelt. + /// Looks up a localized string similar to Resolve MAC address and vendor. /// public static string ResolveMACAddressAndVendor { get { @@ -8750,7 +9163,7 @@ public static string ResolveMACAddressAndVendor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve MAC address is disabled! ähnelt. + /// Looks up a localized string similar to Resolve MAC address is disabled!. /// public static string ResolveMACAddressIsDisabled { get { @@ -8759,7 +9172,7 @@ public static string ResolveMACAddressIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resolve PTR ähnelt. + /// Looks up a localized string similar to Resolve PTR. /// public static string ResolvePTR { get { @@ -8768,7 +9181,7 @@ public static string ResolvePTR { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A collection of all country flags in SVG ähnelt. + /// Looks up a localized string similar to A collection of all country flags in SVG. /// public static string Resource_Flag_Description { get { @@ -8777,7 +9190,7 @@ public static string Resource_Flag_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43 ähnelt. + /// Looks up a localized string similar to List of Top-Level-Domains from iana.org, which is used to query whois servers of the TLD from whois.iana.org via port 43. /// public static string Resource_ListTLD_Description { get { @@ -8786,7 +9199,7 @@ public static string Resource_ListTLD_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die OUI data from ieee.org. ähnelt. + /// Looks up a localized string similar to OUI data from ieee.org.. /// public static string Resource_OUI_Description { get { @@ -8795,7 +9208,7 @@ public static string Resource_OUI_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Service Name and Transport Protocol Port Number Registry from iana.org. ähnelt. + /// Looks up a localized string similar to Service Name and Transport Protocol Port Number Registry from iana.org.. /// public static string Resource_ServiceNamePortNumber_Description { get { @@ -8804,7 +9217,7 @@ public static string Resource_ServiceNamePortNumber_Description { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resources ähnelt. + /// Looks up a localized string similar to Resources. /// public static string Resources { get { @@ -8813,7 +9226,7 @@ public static string Resources { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Responses ähnelt. + /// Looks up a localized string similar to Responses. /// public static string Responses { get { @@ -8822,7 +9235,7 @@ public static string Responses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt. + /// Looks up a localized string similar to Restart. /// public static string Restart { get { @@ -8831,7 +9244,7 @@ public static string Restart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart as Administrator ähnelt. + /// Looks up a localized string similar to Restart as Administrator. /// public static string RestartAsAdmin { get { @@ -8840,7 +9253,7 @@ public static string RestartAsAdmin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart now ähnelt. + /// Looks up a localized string similar to Restart now. /// public static string RestartNow { get { @@ -8849,7 +9262,7 @@ public static string RestartNow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart required ähnelt. + /// Looks up a localized string similar to Restart required. /// public static string RestartRequired { get { @@ -8858,7 +9271,7 @@ public static string RestartRequired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart session ähnelt. + /// Looks up a localized string similar to Restart session. /// public static string RestartSession { get { @@ -8867,7 +9280,7 @@ public static string RestartSession { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restart the application to change the language! ähnelt. + /// Looks up a localized string similar to Restart the application to change the language!. /// public static string RestartTheApplicationToChangeTheLanguage { get { @@ -8876,7 +9289,7 @@ public static string RestartTheApplicationToChangeTheLanguage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restore ähnelt. + /// Looks up a localized string similar to Restore. /// public static string Restore { get { @@ -8885,7 +9298,7 @@ public static string Restore { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restore default location ähnelt. + /// Looks up a localized string similar to Restore default location. /// public static string RestoreDefaultLocation { get { @@ -8894,7 +9307,7 @@ public static string RestoreDefaultLocation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restore default location? ähnelt. + /// Looks up a localized string similar to Restore default location?. /// public static string RestoreDefaultLocationQuestion { get { @@ -8903,9 +9316,9 @@ public static string RestoreDefaultLocationQuestion { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The default profiles location is restored and the application is restarted afterwards. + /// Looks up a localized string similar to The default profiles location is restored and the application is restarted afterwards. /// - ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. ähnelt. + ///You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten.. /// public static string RestoreDefaultProfilesLocationMessage { get { @@ -8914,7 +9327,7 @@ public static string RestoreDefaultProfilesLocationMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Restore defaults ähnelt. + /// Looks up a localized string similar to Restore defaults. /// public static string RestoreDefaults { get { @@ -8923,9 +9336,9 @@ public static string RestoreDefaults { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The default settings location is restored and the application is restarted afterwards. + /// Looks up a localized string similar to The default settings location is restored and the application is restarted afterwards. /// - ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten. ähnelt. + ///You can copy the “settings.json” file from "{0}" to "{1}" to migrate your previous settings, if necessary. The application must be closed for this to prevent the settings from being overwritten.. /// public static string RestoreDefaultSettingsLocationMessage { get { @@ -8934,7 +9347,7 @@ public static string RestoreDefaultSettingsLocationMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Result ähnelt. + /// Looks up a localized string similar to Result. /// public static string Result { get { @@ -8943,7 +9356,7 @@ public static string Result { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Resume ähnelt. + /// Looks up a localized string similar to Resume. /// public static string Resume { get { @@ -8952,7 +9365,7 @@ public static string Resume { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Retries ähnelt. + /// Looks up a localized string similar to Retries. /// public static string Retries { get { @@ -8961,7 +9374,7 @@ public static string Retries { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Retrying in {0} seconds... ähnelt. + /// Looks up a localized string similar to Retrying in {0} seconds.... /// public static string RetryingInXSecondsDots { get { @@ -8970,7 +9383,7 @@ public static string RetryingInXSecondsDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rlogin ähnelt. + /// Looks up a localized string similar to Rlogin. /// public static string Rlogin { get { @@ -8979,7 +9392,7 @@ public static string Rlogin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Rlogin port ähnelt. + /// Looks up a localized string similar to Rlogin port. /// public static string RloginPort { get { @@ -8988,7 +9401,7 @@ public static string RloginPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Round trip delay ähnelt. + /// Looks up a localized string similar to Round trip delay. /// public static string RoundTripDelay { get { @@ -8997,7 +9410,7 @@ public static string RoundTripDelay { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Route ähnelt. + /// Looks up a localized string similar to Route. /// public static string Route { get { @@ -9006,7 +9419,7 @@ public static string Route { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Routing ähnelt. + /// Looks up a localized string similar to Routing. /// public static string Routing { get { @@ -9015,7 +9428,25 @@ public static string Routing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Run background job every x-minute ähnelt. + /// Looks up a localized string similar to Description of the firewall rule. + /// + public static string RuleDescription { + get { + return ResourceManager.GetString("RuleDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The rule has a configuration error. + /// + public static string RuleHasConfigurationError { + get { + return ResourceManager.GetString("RuleHasConfigurationError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run background job every x-minute. /// public static string RunBackgroundJobEveryXMinute { get { @@ -9024,7 +9455,7 @@ public static string RunBackgroundJobEveryXMinute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Save ähnelt. + /// Looks up a localized string similar to Save. /// public static string Save { get { @@ -9033,7 +9464,7 @@ public static string Save { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Save credentials ähnelt. + /// Looks up a localized string similar to Save credentials. /// public static string SaveCredentials { get { @@ -9042,7 +9473,7 @@ public static string SaveCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Save settings in the application folder ähnelt. + /// Looks up a localized string similar to Save settings in the application folder. /// public static string SaveSettingsInApplicationFolder { get { @@ -9051,7 +9482,7 @@ public static string SaveSettingsInApplicationFolder { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scan ähnelt. + /// Looks up a localized string similar to Scan. /// public static string Scan { get { @@ -9060,7 +9491,7 @@ public static string Scan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scan for NetBIOS ähnelt. + /// Looks up a localized string similar to Scan for NetBIOS. /// public static string ScanForNetBIOS { get { @@ -9069,7 +9500,7 @@ public static string ScanForNetBIOS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scanned ähnelt. + /// Looks up a localized string similar to Scanned. /// public static string Scanned { get { @@ -9078,7 +9509,7 @@ public static string Scanned { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Scan ports ähnelt. + /// Looks up a localized string similar to Scan ports. /// public static string ScanPorts { get { @@ -9087,7 +9518,7 @@ public static string ScanPorts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Search ähnelt. + /// Looks up a localized string similar to Search. /// public static string Search { get { @@ -9096,7 +9527,7 @@ public static string Search { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Search... ähnelt. + /// Looks up a localized string similar to Search.... /// public static string SearchDots { get { @@ -9105,7 +9536,7 @@ public static string SearchDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched application not found! ähnelt. + /// Looks up a localized string similar to Searched application not found!. /// public static string SearchedApplicationNotFound { get { @@ -9114,7 +9545,7 @@ public static string SearchedApplicationNotFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched language not found! ähnelt. + /// Looks up a localized string similar to Searched language not found!. /// public static string SearchedLanguageNotFound { get { @@ -9123,7 +9554,7 @@ public static string SearchedLanguageNotFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searched setting not found! ähnelt. + /// Looks up a localized string similar to Searched setting not found!. /// public static string SearchedSettingNotFound { get { @@ -9132,7 +9563,7 @@ public static string SearchedSettingNotFound { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searching for networks... ähnelt. + /// Looks up a localized string similar to Searching for networks.... /// public static string SearchingForNetworksDots { get { @@ -9141,7 +9572,7 @@ public static string SearchingForNetworksDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Searching for WiFi adapters... ähnelt. + /// Looks up a localized string similar to Searching for WiFi adapters.... /// public static string SearchingWiFiAdaptersDots { get { @@ -9150,7 +9581,7 @@ public static string SearchingWiFiAdaptersDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Secondary DNS server ähnelt. + /// Looks up a localized string similar to Secondary DNS server. /// public static string SecondaryDNSServer { get { @@ -9159,7 +9590,7 @@ public static string SecondaryDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Security ähnelt. + /// Looks up a localized string similar to Security. /// public static string Security { get { @@ -9168,7 +9599,7 @@ public static string Security { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select a profile... ähnelt. + /// Looks up a localized string similar to Select a profile.... /// public static string SelectAProfileDots { get { @@ -9177,7 +9608,7 @@ public static string SelectAProfileDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select a screen resolution ähnelt. + /// Looks up a localized string similar to Select a screen resolution. /// public static string SelectAScreenResolution { get { @@ -9186,7 +9617,16 @@ public static string SelectAScreenResolution { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Selected ähnelt. + /// Looks up a localized string similar to Select…. + /// + public static string SelectDots { + get { + return ResourceManager.GetString("SelectDots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected. /// public static string Selected { get { @@ -9195,7 +9635,7 @@ public static string Selected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select OID profile ähnelt. + /// Looks up a localized string similar to Select OID profile. /// public static string SelectOIDProfile { get { @@ -9204,7 +9644,7 @@ public static string SelectOIDProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Select port profile ähnelt. + /// Looks up a localized string similar to Select port profile. /// public static string SelectPortProfile { get { @@ -9213,7 +9653,7 @@ public static string SelectPortProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Send ähnelt. + /// Looks up a localized string similar to Send. /// public static string Send { get { @@ -9222,7 +9662,7 @@ public static string Send { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Serial ähnelt. + /// Looks up a localized string similar to Serial. /// public static string Serial { get { @@ -9231,7 +9671,7 @@ public static string Serial { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Serial line ähnelt. + /// Looks up a localized string similar to Serial line. /// public static string SerialLine { get { @@ -9240,7 +9680,7 @@ public static string SerialLine { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Server ähnelt. + /// Looks up a localized string similar to Server. /// public static string Server { get { @@ -9249,7 +9689,7 @@ public static string Server { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Server name ähnelt. + /// Looks up a localized string similar to Server name. /// public static string ServerName { get { @@ -9258,7 +9698,7 @@ public static string ServerName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Server(s) ähnelt. + /// Looks up a localized string similar to Server(s). /// public static string Servers { get { @@ -9267,7 +9707,7 @@ public static string Servers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Service ähnelt. + /// Looks up a localized string similar to Service. /// public static string Service { get { @@ -9276,7 +9716,7 @@ public static string Service { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Set default ähnelt. + /// Looks up a localized string similar to Set default. /// public static string SetDefault { get { @@ -9285,7 +9725,7 @@ public static string SetDefault { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Set Master Password ähnelt. + /// Looks up a localized string similar to Set Master Password. /// public static string SetMasterPassword { get { @@ -9294,7 +9734,7 @@ public static string SetMasterPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Set Master Password... ähnelt. + /// Looks up a localized string similar to Set Master Password.... /// public static string SetMasterPasswordDots { get { @@ -9303,7 +9743,7 @@ public static string SetMasterPasswordDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This setting is managed by your administrator. ähnelt. + /// Looks up a localized string similar to This setting is managed by your administrator.. /// public static string SettingManagedByAdministrator { get { @@ -9312,7 +9752,7 @@ public static string SettingManagedByAdministrator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings ähnelt. + /// Looks up a localized string similar to Settings. /// public static string Settings { get { @@ -9321,7 +9761,7 @@ public static string Settings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings will be reset and the application will be restarted afterwards! ähnelt. + /// Looks up a localized string similar to The settings will be reset and the application will be restarted afterwards!. /// public static string SettingsAreResetAndApplicationWillBeRestartedMessage { get { @@ -9330,11 +9770,11 @@ public static string SettingsAreResetAndApplicationWillBeRestartedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. + /// Looks up a localized string similar to The found settings file was corrupted or is not compatible with this version! You may report this issue on GitHub. /// ///A backup of the settings file was created in the settings folder and the settings were reset. /// - ///Profile files are not affected! ähnelt. + ///Profile files are not affected!. /// public static string SettingsFileFoundWasCorruptOrNotCompatibleMessage { get { @@ -9343,7 +9783,7 @@ public static string SettingsFileFoundWasCorruptOrNotCompatibleMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Applications ähnelt. + /// Looks up a localized string similar to Applications. /// public static string SettingsGroup_Application { get { @@ -9352,7 +9792,7 @@ public static string SettingsGroup_Application { } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to General. /// public static string SettingsGroup_General { get { @@ -9361,7 +9801,7 @@ public static string SettingsGroup_General { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings have been reset! ähnelt. + /// Looks up a localized string similar to Settings have been reset!. /// public static string SettingsHaveBeenReset { get { @@ -9370,7 +9810,7 @@ public static string SettingsHaveBeenReset { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Appearance ähnelt. + /// Looks up a localized string similar to Appearance. /// public static string SettingsName_Appearance { get { @@ -9379,7 +9819,7 @@ public static string SettingsName_Appearance { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. + /// Looks up a localized string similar to Autostart. /// public static string SettingsName_Autostart { get { @@ -9388,7 +9828,7 @@ public static string SettingsName_Autostart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die General ähnelt. + /// Looks up a localized string similar to General. /// public static string SettingsName_General { get { @@ -9397,7 +9837,7 @@ public static string SettingsName_General { } /// - /// Sucht eine lokalisierte Zeichenfolge, die HotKeys ähnelt. + /// Looks up a localized string similar to HotKeys. /// public static string SettingsName_HotKeys { get { @@ -9406,7 +9846,7 @@ public static string SettingsName_HotKeys { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. + /// Looks up a localized string similar to Language. /// public static string SettingsName_Language { get { @@ -9415,7 +9855,7 @@ public static string SettingsName_Language { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network ähnelt. + /// Looks up a localized string similar to Network. /// public static string SettingsName_Network { get { @@ -9424,7 +9864,7 @@ public static string SettingsName_Network { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profiles ähnelt. + /// Looks up a localized string similar to Profiles. /// public static string SettingsName_Profiles { get { @@ -9433,7 +9873,7 @@ public static string SettingsName_Profiles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings ähnelt. + /// Looks up a localized string similar to Settings. /// public static string SettingsName_Settings { get { @@ -9442,7 +9882,7 @@ public static string SettingsName_Settings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status ähnelt. + /// Looks up a localized string similar to Status. /// public static string SettingsName_Status { get { @@ -9451,7 +9891,7 @@ public static string SettingsName_Status { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update ähnelt. + /// Looks up a localized string similar to Update. /// public static string SettingsName_Update { get { @@ -9460,7 +9900,7 @@ public static string SettingsName_Update { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Window ähnelt. + /// Looks up a localized string similar to Window. /// public static string SettingsName_Window { get { @@ -9469,7 +9909,7 @@ public static string SettingsName_Window { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Settings reset! ähnelt. + /// Looks up a localized string similar to Settings reset!. /// public static string SettingsResetExclamationMark { get { @@ -9478,7 +9918,7 @@ public static string SettingsResetExclamationMark { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Share Gateway credentials with remote computer ähnelt. + /// Looks up a localized string similar to Share Gateway credentials with remote computer. /// public static string ShareGatewayCredentialsWithRemoteComputer { get { @@ -9487,7 +9927,16 @@ public static string ShareGatewayCredentialsWithRemoteComputer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show ähnelt. + /// Looks up a localized string similar to Shift. + /// + public static string Shift { + get { + return ResourceManager.GetString("Shift", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show. /// public static string Show { get { @@ -9496,7 +9945,7 @@ public static string Show { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show address bar ähnelt. + /// Looks up a localized string similar to Show address bar. /// public static string ShowAddressBar { get { @@ -9505,7 +9954,7 @@ public static string ShowAddressBar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show closed ports ähnelt. + /// Looks up a localized string similar to Show closed ports. /// public static string ShowClosedPorts { get { @@ -9514,7 +9963,7 @@ public static string ShowClosedPorts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show current application title ähnelt. + /// Looks up a localized string similar to Show current application title. /// public static string ShowCurrentApplicationTitle { get { @@ -9523,7 +9972,7 @@ public static string ShowCurrentApplicationTitle { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show error message ähnelt. + /// Looks up a localized string similar to Show error message. /// public static string ShowErrorMessage { get { @@ -9532,7 +9981,7 @@ public static string ShowErrorMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show local licenses ähnelt. + /// Looks up a localized string similar to Show local licenses. /// public static string ShowLocalLicenses { get { @@ -9541,7 +9990,7 @@ public static string ShowLocalLicenses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show only most common query types ähnelt. + /// Looks up a localized string similar to Show only most common query types. /// public static string ShowOnlyMostCommonQueryTypes { get { @@ -9550,7 +9999,7 @@ public static string ShowOnlyMostCommonQueryTypes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show SplashScreen on start ähnelt. + /// Looks up a localized string similar to Show SplashScreen on start. /// public static string ShowSplashScreenOnStart { get { @@ -9559,7 +10008,7 @@ public static string ShowSplashScreenOnStart { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show statistics ähnelt. + /// Looks up a localized string similar to Show statistics. /// public static string ShowStatistics { get { @@ -9568,7 +10017,7 @@ public static string ShowStatistics { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show status bar ähnelt. + /// Looks up a localized string similar to Show status bar. /// public static string ShowStatusBar { get { @@ -9577,7 +10026,7 @@ public static string ShowStatusBar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show status window on network change ähnelt. + /// Looks up a localized string similar to Show status window on network change. /// public static string ShowStatusWindowOnNetworkChange { get { @@ -9586,7 +10035,7 @@ public static string ShowStatusWindowOnNetworkChange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show the following application on startup: ähnelt. + /// Looks up a localized string similar to Show the following application on startup:. /// public static string ShowTheFollowingApplicationOnStartup { get { @@ -9595,7 +10044,7 @@ public static string ShowTheFollowingApplicationOnStartup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show unreachable IP addresses and ports ähnelt. + /// Looks up a localized string similar to Show unreachable IP addresses and ports. /// public static string ShowUnreachableIPAddressesAndPorts { get { @@ -9604,7 +10053,7 @@ public static string ShowUnreachableIPAddressesAndPorts { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Show window contents while dragging ähnelt. + /// Looks up a localized string similar to Show window contents while dragging. /// public static string ShowWindowContentsWhileDragging { get { @@ -9613,7 +10062,7 @@ public static string ShowWindowContentsWhileDragging { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Sienna ähnelt. + /// Looks up a localized string similar to Sienna. /// public static string Sienna { get { @@ -9622,7 +10071,7 @@ public static string Sienna { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Signal strength ähnelt. + /// Looks up a localized string similar to Signal strength. /// public static string SignalStrength { get { @@ -9631,7 +10080,7 @@ public static string SignalStrength { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A powerful tool for managing networks and troubleshoot network problems! ähnelt. + /// Looks up a localized string similar to A powerful tool for managing networks and troubleshoot network problems!. /// public static string Slogan { get { @@ -9640,7 +10089,7 @@ public static string Slogan { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNMP ähnelt. + /// Looks up a localized string similar to SNMP. /// public static string SNMP { get { @@ -9649,7 +10098,7 @@ public static string SNMP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication failed. Please check the community string! ähnelt. + /// Looks up a localized string similar to Authentication failed. Please check the community string!. /// public static string SNMPErrorCode_AuthorizationError { get { @@ -9658,7 +10107,7 @@ public static string SNMPErrorCode_AuthorizationError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A read-write or write-only object was set to an inconsistent value! ähnelt. + /// Looks up a localized string similar to A read-write or write-only object was set to an inconsistent value!. /// public static string SNMPErrorCode_BadValue { get { @@ -9667,7 +10116,7 @@ public static string SNMPErrorCode_BadValue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred during the set operation! ähnelt. + /// Looks up a localized string similar to An error occurred during the set operation!. /// public static string SNMPErrorCode_CommitFailed { get { @@ -9676,7 +10125,7 @@ public static string SNMPErrorCode_CommitFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An error occurred for which no specific message is available! ähnelt. + /// Looks up a localized string similar to An error occurred for which no specific message is available!. /// public static string SNMPErrorCode_GenError { get { @@ -9685,7 +10134,7 @@ public static string SNMPErrorCode_GenError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The object's state is inconsistent, preventing the set operation! ähnelt. + /// Looks up a localized string similar to The object's state is inconsistent, preventing the set operation!. /// public static string SNMPErrorCode_InconsistentName { get { @@ -9694,7 +10143,7 @@ public static string SNMPErrorCode_InconsistentName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The MIB variable is currently in an inconsistent state and cannot be modified! ähnelt. + /// Looks up a localized string similar to The MIB variable is currently in an inconsistent state and cannot be modified!. /// public static string SNMPErrorCode_InconsistentValue { get { @@ -9703,7 +10152,7 @@ public static string SNMPErrorCode_InconsistentValue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The requested object is not accessible for modification! ähnelt. + /// Looks up a localized string similar to The requested object is not accessible for modification!. /// public static string SNMPErrorCode_NoAccess { get { @@ -9712,7 +10161,7 @@ public static string SNMPErrorCode_NoAccess { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The requested object does not exist and cannot be created! ähnelt. + /// Looks up a localized string similar to The requested object does not exist and cannot be created!. /// public static string SNMPErrorCode_NoCreation { get { @@ -9721,7 +10170,7 @@ public static string SNMPErrorCode_NoCreation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The operation was successful without any errors. ähnelt. + /// Looks up a localized string similar to The operation was successful without any errors.. /// public static string SNMPErrorCode_NoError { get { @@ -9730,7 +10179,7 @@ public static string SNMPErrorCode_NoError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The requested OID could not be found! ähnelt. + /// Looks up a localized string similar to The requested OID could not be found!. /// public static string SNMPErrorCode_NoSuchName { get { @@ -9739,7 +10188,7 @@ public static string SNMPErrorCode_NoSuchName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The requested object is not writable and cannot be modified! ähnelt. + /// Looks up a localized string similar to The requested object is not writable and cannot be modified!. /// public static string SNMPErrorCode_NotWritable { get { @@ -9748,7 +10197,7 @@ public static string SNMPErrorCode_NotWritable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The requested OID does not exist and is not writable! ähnelt. + /// Looks up a localized string similar to The requested OID does not exist and is not writable!. /// public static string SNMPErrorCode_ReadOnly { get { @@ -9757,7 +10206,7 @@ public static string SNMPErrorCode_ReadOnly { } /// - /// Sucht eine lokalisierte Zeichenfolge, die There are no available system resources to perform the requested operation! ähnelt. + /// Looks up a localized string similar to There are no available system resources to perform the requested operation!. /// public static string SNMPErrorCode_ResourceUnavailable { get { @@ -9766,7 +10215,7 @@ public static string SNMPErrorCode_ResourceUnavailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The response to your request was too large to fit into a single response! ähnelt. + /// Looks up a localized string similar to The response to your request was too large to fit into a single response!. /// public static string SNMPErrorCode_TooBig { get { @@ -9775,7 +10224,7 @@ public static string SNMPErrorCode_TooBig { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A set operation failed, and previous changes could not be rolled back! ähnelt. + /// Looks up a localized string similar to A set operation failed, and previous changes could not be rolled back!. /// public static string SNMPErrorCode_UndoFailed { get { @@ -9784,7 +10233,7 @@ public static string SNMPErrorCode_UndoFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The encoding used for the object is incorrect! ähnelt. + /// Looks up a localized string similar to The encoding used for the object is incorrect!. /// public static string SNMPErrorCode_WrongEncoding { get { @@ -9793,7 +10242,7 @@ public static string SNMPErrorCode_WrongEncoding { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The value assigned to the object exceeds its maximum length! ähnelt. + /// Looks up a localized string similar to The value assigned to the object exceeds its maximum length!. /// public static string SNMPErrorCode_WrongLength { get { @@ -9802,7 +10251,7 @@ public static string SNMPErrorCode_WrongLength { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The object was set to an incompatible data type! ähnelt. + /// Looks up a localized string similar to The object was set to an incompatible data type!. /// public static string SNMPErrorCode_WrongType { get { @@ -9811,7 +10260,7 @@ public static string SNMPErrorCode_WrongType { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The value assigned to the object is not a valid choice! ähnelt. + /// Looks up a localized string similar to The value assigned to the object is not a valid choice!. /// public static string SNMPErrorCode_WrongValue { get { @@ -9820,7 +10269,7 @@ public static string SNMPErrorCode_WrongValue { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication failure (incorrect password, community or key). ähnelt. + /// Looks up a localized string similar to Authentication failure (incorrect password, community or key).. /// public static string SNMPV3ErrorCode_AuthenticationFailed { get { @@ -9829,7 +10278,7 @@ public static string SNMPV3ErrorCode_AuthenticationFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unknown user name. ähnelt. + /// Looks up a localized string similar to Unknown user name.. /// public static string SNMPV3ErrorCode_UnknownUserName { get { @@ -9838,7 +10287,7 @@ public static string SNMPV3ErrorCode_UnknownUserName { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNTP Lookup ähnelt. + /// Looks up a localized string similar to SNTP Lookup. /// public static string SNTPLookup { get { @@ -9847,7 +10296,7 @@ public static string SNTPLookup { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNTP server ähnelt. + /// Looks up a localized string similar to SNTP server. /// public static string SNTPServer { get { @@ -9856,7 +10305,7 @@ public static string SNTPServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SNTP server(s) ähnelt. + /// Looks up a localized string similar to SNTP server(s). /// public static string SNTPServers { get { @@ -9865,7 +10314,7 @@ public static string SNTPServers { } /// - /// Sucht eine lokalisierte Zeichenfolge, die An SNTP server with this name already exists! ähnelt. + /// Looks up a localized string similar to An SNTP server with this name already exists!. /// public static string SNTPServerWithThisNameAlreadyExists { get { @@ -9874,7 +10323,7 @@ public static string SNTPServerWithThisNameAlreadyExists { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Socket ähnelt. + /// Looks up a localized string similar to Socket. /// public static string Socket { get { @@ -9883,7 +10332,7 @@ public static string Socket { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Spaces are not allowed! ähnelt. + /// Looks up a localized string similar to Spaces are not allowed!. /// public static string SpacesAreNotAllowed { get { @@ -9892,7 +10341,7 @@ public static string SpacesAreNotAllowed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Speed ähnelt. + /// Looks up a localized string similar to Speed. /// public static string Speed { get { @@ -9901,7 +10350,7 @@ public static string Speed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SplashScreen ähnelt. + /// Looks up a localized string similar to SplashScreen. /// public static string SplashScreen { get { @@ -9910,7 +10359,7 @@ public static string SplashScreen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH ähnelt. + /// Looks up a localized string similar to SSH. /// public static string SSH { get { @@ -9919,7 +10368,7 @@ public static string SSH { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH log ähnelt. + /// Looks up a localized string similar to SSH log. /// public static string SSHLog { get { @@ -9928,7 +10377,7 @@ public static string SSHLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH port ähnelt. + /// Looks up a localized string similar to SSH port. /// public static string SSHPort { get { @@ -9937,7 +10386,7 @@ public static string SSHPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSH Raw log ähnelt. + /// Looks up a localized string similar to SSH Raw log. /// public static string SSHRawLog { get { @@ -9946,7 +10395,7 @@ public static string SSHRawLog { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SSID ähnelt. + /// Looks up a localized string similar to SSID. /// public static string SSID { get { @@ -9955,7 +10404,7 @@ public static string SSID { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start minimized in tray ähnelt. + /// Looks up a localized string similar to Start minimized in tray. /// public static string StartMinimizedInTray { get { @@ -9964,7 +10413,7 @@ public static string StartMinimizedInTray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start time ähnelt. + /// Looks up a localized string similar to Start time. /// public static string StartTime { get { @@ -9973,7 +10422,7 @@ public static string StartTime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Start with Windows (current user) ähnelt. + /// Looks up a localized string similar to Start with Windows (current user). /// public static string StartWithWindows { get { @@ -9982,7 +10431,7 @@ public static string StartWithWindows { } /// - /// Sucht eine lokalisierte Zeichenfolge, die State ähnelt. + /// Looks up a localized string similar to State. /// public static string State { get { @@ -9991,7 +10440,7 @@ public static string State { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Static IPv4 address ähnelt. + /// Looks up a localized string similar to Static IPv4 address. /// public static string StaticIPv4Address { get { @@ -10000,7 +10449,7 @@ public static string StaticIPv4Address { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Static IPv4 DNS server ähnelt. + /// Looks up a localized string similar to Static IPv4 DNS server. /// public static string StaticIPv4DNSServer { get { @@ -10009,7 +10458,7 @@ public static string StaticIPv4DNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Statistics ähnelt. + /// Looks up a localized string similar to Statistics. /// public static string Statistics { get { @@ -10018,7 +10467,7 @@ public static string Statistics { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status ähnelt. + /// Looks up a localized string similar to Status. /// public static string Status { get { @@ -10027,7 +10476,7 @@ public static string Status { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status change ähnelt. + /// Looks up a localized string similar to Status change. /// public static string StatusChange { get { @@ -10036,7 +10485,7 @@ public static string StatusChange { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Status window ähnelt. + /// Looks up a localized string similar to Status window. /// public static string StatusWindow { get { @@ -10045,7 +10494,7 @@ public static string StatusWindow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Steel ähnelt. + /// Looks up a localized string similar to Steel. /// public static string Steel { get { @@ -10054,7 +10503,7 @@ public static string Steel { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet ähnelt. + /// Looks up a localized string similar to Subnet. /// public static string Subnet { get { @@ -10063,7 +10512,7 @@ public static string Subnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet 1 ähnelt. + /// Looks up a localized string similar to Subnet 1. /// public static string Subnet1 { get { @@ -10072,7 +10521,7 @@ public static string Subnet1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet 2 ähnelt. + /// Looks up a localized string similar to Subnet 2. /// public static string Subnet2 { get { @@ -10081,7 +10530,7 @@ public static string Subnet2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet Calculator ähnelt. + /// Looks up a localized string similar to Subnet Calculator. /// public static string SubnetCalculator { get { @@ -10090,7 +10539,7 @@ public static string SubnetCalculator { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnet mask ähnelt. + /// Looks up a localized string similar to Subnet mask. /// public static string SubnetMask { get { @@ -10099,7 +10548,7 @@ public static string SubnetMask { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Subnetting ähnelt. + /// Looks up a localized string similar to Subnetting. /// public static string Subnetting { get { @@ -10108,7 +10557,7 @@ public static string Subnetting { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Success! ähnelt. + /// Looks up a localized string similar to Success!. /// public static string Success { get { @@ -10117,7 +10566,7 @@ public static string Success { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Successfully connected to {0}! ähnelt. + /// Looks up a localized string similar to Successfully connected to {0}!. /// public static string SuccessfullyConnectedToXXX { get { @@ -10126,7 +10575,7 @@ public static string SuccessfullyConnectedToXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Synchronization is disabled! ähnelt. + /// Looks up a localized string similar to Synchronization is disabled!. /// public static string SyncIsDisabled { get { @@ -10135,7 +10584,7 @@ public static string SyncIsDisabled { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tags ähnelt. + /// Looks up a localized string similar to Tags. /// public static string Tags { get { @@ -10144,7 +10593,7 @@ public static string Tags { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Taupe ähnelt. + /// Looks up a localized string similar to Taupe. /// public static string Taupe { get { @@ -10153,7 +10602,7 @@ public static string Taupe { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TCP/IP stack is available. "{0}" is reachable via ICMP! ähnelt. + /// Looks up a localized string similar to TCP/IP stack is available. "{0}" is reachable via ICMP!. /// public static string TCPIPStackIsAvailableMessage { get { @@ -10162,7 +10611,7 @@ public static string TCPIPStackIsAvailableMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TCP/IP stack is not available... "{0}" is not reachable via ICMP! ähnelt. + /// Looks up a localized string similar to TCP/IP stack is not available... "{0}" is not reachable via ICMP!. /// public static string TCPIPStackIsNotAvailableMessage { get { @@ -10171,7 +10620,7 @@ public static string TCPIPStackIsNotAvailableMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closed ähnelt. + /// Looks up a localized string similar to Closed. /// public static string TcpState_Closed { get { @@ -10180,7 +10629,7 @@ public static string TcpState_Closed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die CloseWait ähnelt. + /// Looks up a localized string similar to CloseWait. /// public static string TcpState_CloseWait { get { @@ -10189,7 +10638,7 @@ public static string TcpState_CloseWait { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Closing ähnelt. + /// Looks up a localized string similar to Closing. /// public static string TcpState_Closing { get { @@ -10198,7 +10647,7 @@ public static string TcpState_Closing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die DeleteTcb ähnelt. + /// Looks up a localized string similar to DeleteTcb. /// public static string TcpState_DeleteTcb { get { @@ -10207,7 +10656,7 @@ public static string TcpState_DeleteTcb { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Established ähnelt. + /// Looks up a localized string similar to Established. /// public static string TcpState_Established { get { @@ -10216,7 +10665,7 @@ public static string TcpState_Established { } /// - /// Sucht eine lokalisierte Zeichenfolge, die FinWait1 ähnelt. + /// Looks up a localized string similar to FinWait1. /// public static string TcpState_FinWait1 { get { @@ -10225,7 +10674,7 @@ public static string TcpState_FinWait1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die FinWait2 ähnelt. + /// Looks up a localized string similar to FinWait2. /// public static string TcpState_FinWait2 { get { @@ -10234,7 +10683,7 @@ public static string TcpState_FinWait2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die LastAck ähnelt. + /// Looks up a localized string similar to LastAck. /// public static string TcpState_LastAck { get { @@ -10243,7 +10692,7 @@ public static string TcpState_LastAck { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Listen ähnelt. + /// Looks up a localized string similar to Listen. /// public static string TcpState_Listen { get { @@ -10252,7 +10701,7 @@ public static string TcpState_Listen { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SynReceived ähnelt. + /// Looks up a localized string similar to SynReceived. /// public static string TcpState_SynReceived { get { @@ -10261,7 +10710,7 @@ public static string TcpState_SynReceived { } /// - /// Sucht eine lokalisierte Zeichenfolge, die SynSent ähnelt. + /// Looks up a localized string similar to SynSent. /// public static string TcpState_SynSent { get { @@ -10270,7 +10719,7 @@ public static string TcpState_SynSent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TimeWait ähnelt. + /// Looks up a localized string similar to TimeWait. /// public static string TcpState_TimeWait { get { @@ -10279,7 +10728,7 @@ public static string TcpState_TimeWait { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unkown ähnelt. + /// Looks up a localized string similar to Unkown. /// public static string TcpState_Unknown { get { @@ -10288,7 +10737,7 @@ public static string TcpState_Unknown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Teal ähnelt. + /// Looks up a localized string similar to Teal. /// public static string Teal { get { @@ -10297,7 +10746,7 @@ public static string Teal { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Telnet ähnelt. + /// Looks up a localized string similar to Telnet. /// public static string Telnet { get { @@ -10306,7 +10755,7 @@ public static string Telnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Telnet port ähnelt. + /// Looks up a localized string similar to Telnet port. /// public static string TelnetPort { get { @@ -10315,7 +10764,7 @@ public static string TelnetPort { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Terabits ähnelt. + /// Looks up a localized string similar to Terabits. /// public static string Terabits { get { @@ -10324,7 +10773,7 @@ public static string Terabits { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Terabytes ähnelt. + /// Looks up a localized string similar to Terabytes. /// public static string Terabytes { get { @@ -10333,7 +10782,7 @@ public static string Terabytes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application can be started without parameters! ähnelt. + /// Looks up a localized string similar to The application can be started without parameters!. /// public static string TheApplicationCanBeStartedWithoutParameters { get { @@ -10342,7 +10791,7 @@ public static string TheApplicationCanBeStartedWithoutParameters { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The application will be restarted... ähnelt. + /// Looks up a localized string similar to The application will be restarted.... /// public static string TheApplicationWillBeRestarted { get { @@ -10351,7 +10800,7 @@ public static string TheApplicationWillBeRestarted { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following hostnames could not be resolved: ähnelt. + /// Looks up a localized string similar to The following hostnames could not be resolved:. /// public static string TheFollowingHostnamesCouldNotBeResolved { get { @@ -10360,7 +10809,7 @@ public static string TheFollowingHostnamesCouldNotBeResolved { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following parameters are available: ähnelt. + /// Looks up a localized string similar to The following parameters are available:. /// public static string TheFollowingParametersAreAvailable { get { @@ -10369,7 +10818,7 @@ public static string TheFollowingParametersAreAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The following parameters can not be processed: ähnelt. + /// Looks up a localized string similar to The following parameters can not be processed:. /// public static string TheFollowingParametersCanNotBeProcesses { get { @@ -10378,7 +10827,7 @@ public static string TheFollowingParametersCanNotBeProcesses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Theme ähnelt. + /// Looks up a localized string similar to Theme. /// public static string Theme { get { @@ -10387,7 +10836,7 @@ public static string Theme { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Dark ähnelt. + /// Looks up a localized string similar to Dark. /// public static string Theme_Dark { get { @@ -10396,7 +10845,7 @@ public static string Theme_Dark { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Light ähnelt. + /// Looks up a localized string similar to Light. /// public static string Theme_Light { get { @@ -10405,7 +10854,7 @@ public static string Theme_Light { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The process can take up some time and resources (CPU / RAM). ähnelt. + /// Looks up a localized string similar to The process can take up some time and resources (CPU / RAM).. /// public static string TheProcessCanTakeUpSomeTimeAndResources { get { @@ -10414,7 +10863,7 @@ public static string TheProcessCanTakeUpSomeTimeAndResources { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The settings location is not affected! ähnelt. + /// Looks up a localized string similar to The settings location is not affected!. /// public static string TheSettingsLocationIsNotAffected { get { @@ -10423,7 +10872,7 @@ public static string TheSettingsLocationIsNotAffected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This will reset all settings! ähnelt. + /// Looks up a localized string similar to This will reset all settings!. /// public static string ThisWillResetAllSettings { get { @@ -10432,7 +10881,7 @@ public static string ThisWillResetAllSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die ThreadPool additional min. threads ähnelt. + /// Looks up a localized string similar to ThreadPool additional min. threads. /// public static string ThreadPoolAdditionalMinThreads { get { @@ -10441,7 +10890,7 @@ public static string ThreadPoolAdditionalMinThreads { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Threads ähnelt. + /// Looks up a localized string similar to Threads. /// public static string Threads { get { @@ -10450,7 +10899,7 @@ public static string Threads { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC ähnelt. + /// Looks up a localized string similar to TigerVNC. /// public static string TigerVNC { get { @@ -10459,7 +10908,7 @@ public static string TigerVNC { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TigerVNC process has ended! ähnelt. + /// Looks up a localized string similar to TigerVNC process has ended!. /// public static string TigerVNCProcessHasEnded { get { @@ -10468,7 +10917,7 @@ public static string TigerVNCProcessHasEnded { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time ähnelt. + /// Looks up a localized string similar to Time. /// public static string Time { get { @@ -10477,7 +10926,7 @@ public static string Time { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 1 ähnelt. + /// Looks up a localized string similar to Time 1. /// public static string Time1 { get { @@ -10486,7 +10935,7 @@ public static string Time1 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 2 ähnelt. + /// Looks up a localized string similar to Time 2. /// public static string Time2 { get { @@ -10495,7 +10944,7 @@ public static string Time2 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time 3 ähnelt. + /// Looks up a localized string similar to Time 3. /// public static string Time3 { get { @@ -10504,7 +10953,7 @@ public static string Time3 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time in seconds how long the status window is shown ähnelt. + /// Looks up a localized string similar to Time in seconds how long the status window is shown. /// public static string TimeInSecondsHowLongTheStatusWindowIsShown { get { @@ -10513,7 +10962,7 @@ public static string TimeInSecondsHowLongTheStatusWindowIsShown { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time (ms) to wait between each ping ähnelt. + /// Looks up a localized string similar to Time (ms) to wait between each ping. /// public static string TimeMSToWaitBetweenEachPing { get { @@ -10522,7 +10971,7 @@ public static string TimeMSToWaitBetweenEachPing { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout ähnelt. + /// Looks up a localized string similar to Timeout. /// public static string Timeout { get { @@ -10531,7 +10980,7 @@ public static string Timeout { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout (ms) ähnelt. + /// Looks up a localized string similar to Timeout (ms). /// public static string TimeoutMS { get { @@ -10540,7 +10989,7 @@ public static string TimeoutMS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong. ähnelt. + /// Looks up a localized string similar to Timeout on SNMP query. Maybe the host is not reachable or the community / password is wrong.. /// public static string TimeoutOnSNMPQuery { get { @@ -10549,7 +10998,7 @@ public static string TimeoutOnSNMPQuery { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout (s) ähnelt. + /// Looks up a localized string similar to Timeout (s). /// public static string TimeoutS { get { @@ -10558,7 +11007,7 @@ public static string TimeoutS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timeout when querying the DNS server with the IP address "{0}"! ähnelt. + /// Looks up a localized string similar to Timeout when querying the DNS server with the IP address "{0}"!. /// public static string TimeoutWhenQueryingDNSServerMessage { get { @@ -10567,7 +11016,7 @@ public static string TimeoutWhenQueryingDNSServerMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timestamp ähnelt. + /// Looks up a localized string similar to Timestamp. /// public static string Timestamp { get { @@ -10576,7 +11025,7 @@ public static string Timestamp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Time to live ähnelt. + /// Looks up a localized string similar to Time to live. /// public static string TimeToLive { get { @@ -10585,7 +11034,7 @@ public static string TimeToLive { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Hour(s) ähnelt. + /// Looks up a localized string similar to Hour(s). /// public static string TimeUnit_Hour { get { @@ -10594,7 +11043,7 @@ public static string TimeUnit_Hour { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Minute(s) ähnelt. + /// Looks up a localized string similar to Minute(s). /// public static string TimeUnit_Minute { get { @@ -10603,7 +11052,7 @@ public static string TimeUnit_Minute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Second(s) ähnelt. + /// Looks up a localized string similar to Second(s). /// public static string TimeUnit_Second { get { @@ -10612,7 +11061,7 @@ public static string TimeUnit_Second { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Timezone ähnelt. + /// Looks up a localized string similar to Timezone. /// public static string Timezone { get { @@ -10621,7 +11070,7 @@ public static string Timezone { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Follow or contact me via X. ähnelt. + /// Looks up a localized string similar to Follow or contact me via X.. /// public static string ToolTip_ContactOrContactMeViaX { get { @@ -10630,7 +11079,7 @@ public static string ToolTip_ContactOrContactMeViaX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Help translate the project on Transifex. ähnelt. + /// Looks up a localized string similar to Help translate the project on Transifex.. /// public static string ToolTip_HelpTranslateOnTransifex { get { @@ -10639,7 +11088,16 @@ public static string ToolTip_HelpTranslateOnTransifex { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Open the documentation. ähnelt. + /// Looks up a localized string similar to Do not change system configuration. + /// + public static string ToolTip_NetProfileNotConfigured { + get { + return ResourceManager.GetString("ToolTip_NetProfileNotConfigured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open the documentation.. /// public static string ToolTip_OpenTheDocumentation { get { @@ -10648,7 +11106,7 @@ public static string ToolTip_OpenTheDocumentation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Report an issue or create a feature request. ähnelt. + /// Looks up a localized string similar to Report an issue or create a feature request.. /// public static string ToolTip_ReportIssueOrCreateFeatureRequest { get { @@ -10657,7 +11115,7 @@ public static string ToolTip_ReportIssueOrCreateFeatureRequest { } /// - /// Sucht eine lokalisierte Zeichenfolge, die A restart is required to apply changes such as language settings. ähnelt. + /// Looks up a localized string similar to A restart is required to apply changes such as language settings.. /// public static string ToolTip_RestartRequired { get { @@ -10666,7 +11124,7 @@ public static string ToolTip_RestartRequired { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Run command... (Ctrl+Shift+P) ähnelt. + /// Looks up a localized string similar to Run command... (Ctrl+Shift+P). /// public static string ToolTip_RunCommandWithHotKey { get { @@ -10675,7 +11133,7 @@ public static string ToolTip_RunCommandWithHotKey { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Star/Fork the Project on GitHub. ähnelt. + /// Looks up a localized string similar to Star/Fork the Project on GitHub.. /// public static string ToolTip_StarForkProjectOnGitHub { get { @@ -10684,7 +11142,7 @@ public static string ToolTip_StarForkProjectOnGitHub { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Support this project with a donation. ähnelt. + /// Looks up a localized string similar to Support this project with a donation.. /// public static string ToolTip_SupportThisProjectWithADonation { get { @@ -10693,7 +11151,7 @@ public static string ToolTip_SupportThisProjectWithADonation { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total bytes received ähnelt. + /// Looks up a localized string similar to Total bytes received. /// public static string TotalBytesReceived { get { @@ -10702,7 +11160,7 @@ public static string TotalBytesReceived { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total bytes sent ähnelt. + /// Looks up a localized string similar to Total bytes sent. /// public static string TotalBytesSent { get { @@ -10711,7 +11169,7 @@ public static string TotalBytesSent { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total download ähnelt. + /// Looks up a localized string similar to Total download. /// public static string TotalDownload { get { @@ -10720,7 +11178,7 @@ public static string TotalDownload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Total upload ähnelt. + /// Looks up a localized string similar to Total upload. /// public static string TotalUpload { get { @@ -10729,7 +11187,7 @@ public static string TotalUpload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Trace ähnelt. + /// Looks up a localized string similar to Trace. /// public static string Trace { get { @@ -10738,7 +11196,7 @@ public static string Trace { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Traceroute ähnelt. + /// Looks up a localized string similar to Traceroute. /// public static string Traceroute { get { @@ -10747,7 +11205,7 @@ public static string Traceroute { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Tray ähnelt. + /// Looks up a localized string similar to Tray. /// public static string Tray { get { @@ -10756,7 +11214,7 @@ public static string Tray { } /// - /// Sucht eine lokalisierte Zeichenfolge, die TTL ähnelt. + /// Looks up a localized string similar to TTL. /// public static string TTL { get { @@ -10765,7 +11223,7 @@ public static string TTL { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Type ähnelt. + /// Looks up a localized string similar to Type. /// public static string Type { get { @@ -10774,7 +11232,7 @@ public static string Type { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unit ähnelt. + /// Looks up a localized string similar to Unit. /// public static string Unit { get { @@ -10783,7 +11241,7 @@ public static string Unit { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unkown error! ähnelt. + /// Looks up a localized string similar to Unkown error!. /// public static string UnkownError { get { @@ -10792,7 +11250,7 @@ public static string UnkownError { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock profile ähnelt. + /// Looks up a localized string similar to Unlock profile. /// public static string UnlockProfile { get { @@ -10801,7 +11259,7 @@ public static string UnlockProfile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock profile file ähnelt. + /// Looks up a localized string similar to Unlock profile file. /// public static string UnlockProfileFile { get { @@ -10810,7 +11268,7 @@ public static string UnlockProfileFile { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Unlock the profile file to use the profiles! ähnelt. + /// Looks up a localized string similar to Unlock the profile file to use the profiles!. /// public static string UnlockTheProfileFileMessage { get { @@ -10819,7 +11277,7 @@ public static string UnlockTheProfileFileMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Untray / Bring window to foreground ähnelt. + /// Looks up a localized string similar to Untray / Bring window to foreground. /// public static string UntrayBringWindowToForeground { get { @@ -10828,7 +11286,7 @@ public static string UntrayBringWindowToForeground { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update ähnelt. + /// Looks up a localized string similar to Update. /// public static string Update { get { @@ -10837,7 +11295,7 @@ public static string Update { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Update available! ähnelt. + /// Looks up a localized string similar to Update available!. /// public static string UpdateAvailable { get { @@ -10846,7 +11304,7 @@ public static string UpdateAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Upgraded to {0} ähnelt. + /// Looks up a localized string similar to Upgraded to {0}. /// public static string UpgradedToXXX { get { @@ -10855,7 +11313,7 @@ public static string UpgradedToXXX { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Upload ähnelt. + /// Looks up a localized string similar to Upload. /// public static string Upload { get { @@ -10864,7 +11322,7 @@ public static string Upload { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Uptime ähnelt. + /// Looks up a localized string similar to Uptime. /// public static string Uptime { get { @@ -10873,7 +11331,7 @@ public static string Uptime { } /// - /// Sucht eine lokalisierte Zeichenfolge, die URL ähnelt. + /// Looks up a localized string similar to URL. /// public static string URL { get { @@ -10882,7 +11340,7 @@ public static string URL { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use cache ähnelt. + /// Looks up a localized string similar to Use cache. /// public static string UseCache { get { @@ -10891,7 +11349,7 @@ public static string UseCache { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use credentials ähnelt. + /// Looks up a localized string similar to Use credentials. /// public static string UseCredentials { get { @@ -10900,7 +11358,7 @@ public static string UseCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the current view size as the screen size ähnelt. + /// Looks up a localized string similar to Use the current view size as the screen size. /// public static string UseCurrentViewSize { get { @@ -10909,7 +11367,7 @@ public static string UseCurrentViewSize { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom DNS server ähnelt. + /// Looks up a localized string similar to Use custom DNS server. /// public static string UseCustomDNSServer { get { @@ -10918,7 +11376,7 @@ public static string UseCustomDNSServer { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom DNS suffix ähnelt. + /// Looks up a localized string similar to Use custom DNS suffix. /// public static string UseCustomDNSSuffix { get { @@ -10927,7 +11385,7 @@ public static string UseCustomDNSSuffix { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom IPv4 address API ähnelt. + /// Looks up a localized string similar to Use custom IPv4 address API. /// public static string UseCustomIPv4AddressAPI { get { @@ -10936,7 +11394,7 @@ public static string UseCustomIPv4AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom IPv6 address API ähnelt. + /// Looks up a localized string similar to Use custom IPv6 address API. /// public static string UseCustomIPv6AddressAPI { get { @@ -10945,7 +11403,7 @@ public static string UseCustomIPv6AddressAPI { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use custom themes ähnelt. + /// Looks up a localized string similar to Use custom themes. /// public static string UseCustomThemes { get { @@ -10954,7 +11412,7 @@ public static string UseCustomThemes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use gateway credentials ähnelt. + /// Looks up a localized string similar to Use gateway credentials. /// public static string UseGatewayCredentials { get { @@ -10963,7 +11421,7 @@ public static string UseGatewayCredentials { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use only TCP ähnelt. + /// Looks up a localized string similar to Use only TCP. /// public static string UseOnlyTCP { get { @@ -10972,7 +11430,7 @@ public static string UseOnlyTCP { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use other ähnelt. + /// Looks up a localized string similar to Use other. /// public static string UseOther { get { @@ -10981,7 +11439,7 @@ public static string UseOther { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use resolver cache ähnelt. + /// Looks up a localized string similar to Use resolver cache. /// public static string UseResolverCache { get { @@ -10990,7 +11448,7 @@ public static string UseResolverCache { } /// - /// Sucht eine lokalisierte Zeichenfolge, die User interface locked! ähnelt. + /// Looks up a localized string similar to User interface locked!. /// public static string UserInterfaceLocked { get { @@ -10999,7 +11457,7 @@ public static string UserInterfaceLocked { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Username ähnelt. + /// Looks up a localized string similar to Username. /// public static string Username { get { @@ -11008,7 +11466,7 @@ public static string Username { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the following DNS server addresses: ähnelt. + /// Looks up a localized string similar to Use the following DNS server addresses:. /// public static string UseTheFollowingDNSServerAddresses { get { @@ -11017,7 +11475,7 @@ public static string UseTheFollowingDNSServerAddresses { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Use the following IP address: ähnelt. + /// Looks up a localized string similar to Use the following IP address:. /// public static string UseTheFollowingIPAddress { get { @@ -11026,7 +11484,16 @@ public static string UseTheFollowingIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die v1/v2c ähnelt. + /// Looks up a localized string similar to Use Windows port list syntax. + /// + public static string UseWindowsPortListSyntax { + get { + return ResourceManager.GetString("UseWindowsPortListSyntax", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to v1/v2c. /// public static string v1v2c { get { @@ -11035,7 +11502,7 @@ public static string v1v2c { } /// - /// Sucht eine lokalisierte Zeichenfolge, die v3 ähnelt. + /// Looks up a localized string similar to v3. /// public static string v3 { get { @@ -11044,7 +11511,7 @@ public static string v3 { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Validate ähnelt. + /// Looks up a localized string similar to Validate. /// public static string Validate { get { @@ -11053,7 +11520,7 @@ public static string Validate { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Validation failed! ähnelt. + /// Looks up a localized string similar to Validation failed!. /// public static string ValidationFailed { get { @@ -11062,7 +11529,7 @@ public static string ValidationFailed { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Value ähnelt. + /// Looks up a localized string similar to Value. /// public static string Value { get { @@ -11071,7 +11538,7 @@ public static string Value { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Vendor ähnelt. + /// Looks up a localized string similar to Vendor. /// public static string Vendor { get { @@ -11080,7 +11547,7 @@ public static string Vendor { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Version ähnelt. + /// Looks up a localized string similar to Version. /// public static string Version { get { @@ -11089,7 +11556,7 @@ public static string Version { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Version {0} is available! ähnelt. + /// Looks up a localized string similar to Version {0} is available!. /// public static string VersionxxIsAvailable { get { @@ -11098,7 +11565,7 @@ public static string VersionxxIsAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Violet ähnelt. + /// Looks up a localized string similar to Violet. /// public static string Violet { get { @@ -11107,7 +11574,7 @@ public static string Violet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visible applications ähnelt. + /// Looks up a localized string similar to Visible applications. /// public static string VisibleApplications { get { @@ -11116,7 +11583,7 @@ public static string VisibleApplications { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visible applications in the bar: ähnelt. + /// Looks up a localized string similar to Visible applications in the bar:. /// public static string VisibleApplicationsInTheBar { get { @@ -11125,7 +11592,7 @@ public static string VisibleApplicationsInTheBar { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Visual styles ähnelt. + /// Looks up a localized string similar to Visual styles. /// public static string VisualStyles { get { @@ -11134,7 +11601,7 @@ public static string VisualStyles { } /// - /// Sucht eine lokalisierte Zeichenfolge, die VLAN ähnelt. + /// Looks up a localized string similar to VLAN. /// public static string VLAN { get { @@ -11143,7 +11610,7 @@ public static string VLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake on LAN ähnelt. + /// Looks up a localized string similar to Wake on LAN. /// public static string WakeOnLAN { get { @@ -11152,7 +11619,7 @@ public static string WakeOnLAN { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wake up ähnelt. + /// Looks up a localized string similar to Wake up. /// public static string WakeUp { get { @@ -11161,7 +11628,7 @@ public static string WakeUp { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Walk mode ähnelt. + /// Looks up a localized string similar to Walk mode. /// public static string WalkMode { get { @@ -11170,7 +11637,7 @@ public static string WalkMode { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Could not resolve ip address for hostname! ähnelt. + /// Looks up a localized string similar to Could not resolve ip address for hostname!. /// public static string WarningMessage_CouldNotResolveIPAddressForHostname { get { @@ -11179,9 +11646,9 @@ public static string WarningMessage_CouldNotResolveIPAddressForHostname { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The current profile file is not encrypted and passwords will stored unencrypted on disk! + /// Looks up a localized string similar to The current profile file is not encrypted and passwords will stored unencrypted on disk! /// - ///Enable profile file encryption in Settings>Profile to store credentials securely. ähnelt. + ///Enable profile file encryption in Settings>Profile to store credentials securely.. /// public static string WarningMessage_ProfileFileNotEncryptedStoringPasswords { get { @@ -11190,7 +11657,7 @@ public static string WarningMessage_ProfileFileNotEncryptedStoringPasswords { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances. ähnelt. + /// Looks up a localized string similar to Enabling this setting is not recommended. Multiple instances of the application share the same settings and profile files. The last instance to be closed may overwrite changes made by other instances.. /// public static string WarnMessage_MultipleInstances { get { @@ -11199,7 +11666,7 @@ public static string WarnMessage_MultipleInstances { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Run command... ähnelt. + /// Looks up a localized string similar to Run command.... /// public static string Watermark_RunCommand { get { @@ -11208,7 +11675,7 @@ public static string Watermark_RunCommand { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Run command... (Ctrl+Shift+P) ähnelt. + /// Looks up a localized string similar to Run command... (Ctrl+Shift+P). /// public static string Watermark_RunCommandWithHotKey { get { @@ -11217,7 +11684,7 @@ public static string Watermark_RunCommandWithHotKey { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Web Console ähnelt. + /// Looks up a localized string similar to Web Console. /// public static string WebConsole { get { @@ -11226,7 +11693,7 @@ public static string WebConsole { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Website ähnelt. + /// Looks up a localized string similar to Website. /// public static string Website { get { @@ -11235,7 +11702,7 @@ public static string Website { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate! ähnelt. + /// Looks up a localized string similar to The WebView control (Microsoft Edge) cannot connect to websites with an invalid certificate!. /// public static string WebViewControlCertificateIsInvalidMessage { get { @@ -11244,7 +11711,7 @@ public static string WebViewControlCertificateIsInvalidMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Welcome ähnelt. + /// Looks up a localized string similar to Welcome. /// public static string Welcome { get { @@ -11253,9 +11720,9 @@ public static string Welcome { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Thank you for using NETworkManager! + /// Looks up a localized string similar to Thank you for using NETworkManager! /// - ///If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing. ähnelt. + ///If you enjoy it, please consider supporting its development — whether by leaving a star on GitHub, making a donation, or simply sharing it with others. Your support helps keep the project going and growing.. /// public static string WelcomeMessage { get { @@ -11264,7 +11731,7 @@ public static string WelcomeMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time. ähnelt. + /// Looks up a localized string similar to To provide additional features, third party services are used that are not operated by me. You can deselect them below. No data is transferred to me at any time.. /// public static string WelcomePrivacyMessage { get { @@ -11273,7 +11740,7 @@ public static string WelcomePrivacyMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die What's new? ähnelt. + /// Looks up a localized string similar to What's new?. /// public static string WhatsNew { get { @@ -11282,7 +11749,7 @@ public static string WhatsNew { } /// - /// Sucht eine lokalisierte Zeichenfolge, die This release includes new features, improvements, and bug fixes. Check out the changelog for all the details! ähnelt. + /// Looks up a localized string similar to This release includes new features, improvements, and bug fixes. Check out the changelog for all the details!. /// public static string WhatsNewMessage { get { @@ -11291,7 +11758,7 @@ public static string WhatsNewMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die White ähnelt. + /// Looks up a localized string similar to White. /// public static string White { get { @@ -11300,7 +11767,7 @@ public static string White { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois ähnelt. + /// Looks up a localized string similar to Whois. /// public static string Whois { get { @@ -11309,7 +11776,7 @@ public static string Whois { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Whois server not found for the domain: "{0}" ähnelt. + /// Looks up a localized string similar to Whois server not found for the domain: "{0}". /// public static string WhoisServerNotFoundForTheDomain { get { @@ -11318,7 +11785,7 @@ public static string WhoisServerNotFoundForTheDomain { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wide Subnet ähnelt. + /// Looks up a localized string similar to Wide Subnet. /// public static string WideSubnet { get { @@ -11327,7 +11794,7 @@ public static string WideSubnet { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Width ähnelt. + /// Looks up a localized string similar to Width. /// public static string Width { get { @@ -11336,7 +11803,7 @@ public static string Width { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WiFi ähnelt. + /// Looks up a localized string similar to WiFi. /// public static string WiFi { get { @@ -11345,9 +11812,9 @@ public static string WiFi { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. + /// Looks up a localized string similar to Starting with Windows 11 24H2, you’ll need to allow access to the Wi-Fi adapter. /// - ///Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application. ähnelt. + ///Open Windows Settings > Privacy & security > Location, enable access for Desktop Apps / NETworkManager, then restart the application.. /// public static string WiFiAccessNotAvailableMessage { get { @@ -11356,7 +11823,7 @@ public static string WiFiAccessNotAvailableMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Access to the network has been revoked ähnelt. + /// Looks up a localized string similar to Access to the network has been revoked. /// public static string WiFiConnectionStatus_AccessRevoked { get { @@ -11365,7 +11832,7 @@ public static string WiFiConnectionStatus_AccessRevoked { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Invalid credentials ähnelt. + /// Looks up a localized string similar to Invalid credentials. /// public static string WiFiConnectionStatus_InvalidCredential { get { @@ -11374,7 +11841,7 @@ public static string WiFiConnectionStatus_InvalidCredential { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Network not available ähnelt. + /// Looks up a localized string similar to Network not available. /// public static string WiFiConnectionStatus_NetworkNotAvailable { get { @@ -11383,7 +11850,7 @@ public static string WiFiConnectionStatus_NetworkNotAvailable { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Successful ähnelt. + /// Looks up a localized string similar to Successful. /// public static string WiFiConnectionStatus_Success { get { @@ -11392,7 +11859,7 @@ public static string WiFiConnectionStatus_Success { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Connection attempt timed out ähnelt. + /// Looks up a localized string similar to Connection attempt timed out. /// public static string WiFiConnectionStatus_Timeout { get { @@ -11401,7 +11868,7 @@ public static string WiFiConnectionStatus_Timeout { } /// - /// Sucht eine lokalisierte Zeichenfolge, die -/- ähnelt. + /// Looks up a localized string similar to -/-. /// public static string WiFiConnectionStatus_UnspecifiedFailure { get { @@ -11410,7 +11877,7 @@ public static string WiFiConnectionStatus_UnspecifiedFailure { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Authentication protocol is not supported! ähnelt. + /// Looks up a localized string similar to Authentication protocol is not supported!. /// public static string WiFiConnectionStatus_UnsupportedAuthenticationProtocol { get { @@ -11419,7 +11886,7 @@ public static string WiFiConnectionStatus_UnsupportedAuthenticationProtocol { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Window ähnelt. + /// Looks up a localized string similar to Window. /// public static string Window { get { @@ -11428,7 +11895,7 @@ public static string Window { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Windows DNS settings ähnelt. + /// Looks up a localized string similar to Windows DNS settings. /// public static string WindowsDNSSettings { get { @@ -11437,7 +11904,34 @@ public static string WindowsDNSSettings { } /// - /// Sucht eine lokalisierte Zeichenfolge, die WPS ähnelt. + /// Looks up a localized string similar to Windows firewall settings. + /// + public static string WindowsFirewallSettings { + get { + return ResourceManager.GetString("WindowsFirewallSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wired. + /// + public static string Wired { + get { + return ResourceManager.GetString("Wired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wireless. + /// + public static string Wireless { + get { + return ResourceManager.GetString("Wireless", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WPS. /// public static string WPS { get { @@ -11446,7 +11940,7 @@ public static string WPS { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Wrong password! ähnelt. + /// Looks up a localized string similar to Wrong password!. /// public static string WrongPassword { get { @@ -11455,7 +11949,7 @@ public static string WrongPassword { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Profile file could not be decrypted with the given password. ähnelt. + /// Looks up a localized string similar to Profile file could not be decrypted with the given password.. /// public static string WrongPasswordDecryptionFailedMessage { get { @@ -11464,7 +11958,7 @@ public static string WrongPasswordDecryptionFailedMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die The entered password is wrong. ähnelt. + /// Looks up a localized string similar to The entered password is wrong.. /// public static string WrongPasswordMessage { get { @@ -11473,7 +11967,7 @@ public static string WrongPasswordMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" A dns records resolved for "{1}"! ähnelt. + /// Looks up a localized string similar to "{0}" A dns records resolved for "{1}"!. /// public static string XADNSRecordsResolvedForXXXMessage { get { @@ -11482,7 +11976,7 @@ public static string XADNSRecordsResolvedForXXXMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die {0} seconds remaining... ähnelt. + /// Looks up a localized string similar to {0} seconds remaining.... /// public static string XXSecondsRemainingDots { get { @@ -11491,7 +11985,7 @@ public static string XXSecondsRemainingDots { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" detected as gateway ip address! ähnelt. + /// Looks up a localized string similar to "{0}" detected as gateway ip address!. /// public static string XXXDetectedAsGatewayIPAddress { get { @@ -11500,7 +11994,7 @@ public static string XXXDetectedAsGatewayIPAddress { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" detected as local ip address! ähnelt. + /// Looks up a localized string similar to "{0}" detected as local ip address!. /// public static string XXXDetectedAsLocalIPAddressMessage { get { @@ -11509,7 +12003,7 @@ public static string XXXDetectedAsLocalIPAddressMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die {0} disconnected! ähnelt. + /// Looks up a localized string similar to {0} disconnected!. /// public static string XXXDisconnected { get { @@ -11518,7 +12012,7 @@ public static string XXXDisconnected { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" is not reachable via ICMP! ähnelt. + /// Looks up a localized string similar to "{0}" is not reachable via ICMP!. /// public static string XXXIsNotReachableViaICMPMessage { get { @@ -11527,7 +12021,7 @@ public static string XXXIsNotReachableViaICMPMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die "{0}" is reachable via ICMP! ähnelt. + /// Looks up a localized string similar to "{0}" is reachable via ICMP!. /// public static string XXXIsReachableViaICMPMessage { get { @@ -11536,7 +12030,7 @@ public static string XXXIsReachableViaICMPMessage { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yellow ähnelt. + /// Looks up a localized string similar to Yellow. /// public static string Yellow { get { @@ -11545,7 +12039,7 @@ public static string Yellow { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Yes ähnelt. + /// Looks up a localized string similar to Yes. /// public static string Yes { get { @@ -11554,7 +12048,7 @@ public static string Yes { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Your system OS is incompatible with the latest release! ähnelt. + /// Looks up a localized string similar to Your system OS is incompatible with the latest release!. /// public static string YourSystemOSIsIncompatibleWithTheLatestRelease { get { @@ -11563,7 +12057,7 @@ public static string YourSystemOSIsIncompatibleWithTheLatestRelease { } /// - /// Sucht eine lokalisierte Zeichenfolge, die Zip ähnelt. + /// Looks up a localized string similar to Zip. /// public static string ZipCode { get { diff --git a/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx b/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx index ff9143d48f..0c39b2e539 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.cs-CZ.resx @@ -3945,6 +3945,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3998,4 +4001,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Not configured + + + Outbound + + + Private + + + Prv + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Maximum length of port entries + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx b/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx index 720a4df8ee..0cbbab872d 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.de-DE.resx @@ -3913,7 +3913,7 @@ Rechtsklick für weitere Optionen. Match - Any + Beliebig Gruppe hinzufügen... @@ -3945,6 +3945,12 @@ Wenn Sie auf „Abbrechen“ klicken, bleibt die Profildatei unverschlüsselt. Ein Neustart ist erforderlich, um Änderungen wie Spracheinstellungen zu übernehmen. + + Netzwerkprofil + + + Netzwerkprofiltyp + Keiner der angegebenen DNS-Server konnte geparst oder aufgelöst werden. @@ -3998,4 +4004,163 @@ Bei Bedarf können Sie die Profiledateien von „{0}“ nach „{1}“ kopieren, Bei Bedarf können Sie die Profildateien von „{0}“ nach „{1}“ kopieren, um Ihre bisherigen Profile zu migrieren. Dazu muss die Anwendung geschlossen sein, damit die Profile nicht überschrieben werden. + + Netzwerkprofiltyp + + + Systemkonfiguration nicht verändern + + + Öffentlich + + + Privat + + + Nicht konfiguriert + + + Nichts auswählen + + + Richtung + + + Lokale Ports + + + Remote Ports + + + Eingehend + + + Ausgehend + + + Das Zeichen ‚|’ darf nicht enthalten sein. + + + Prv + + + Zulassen + + + Blockieren + + + Aktion + + + Geben Sie den Pfad zu einer *.exe Datei an. + + + Auswählen… + + + Beschreibung der Firewallregel + + + Öfl + + + Dom + + + Zulässige Eingabelänge überschritten + + + Firewall + + + Verlauf von lokalen und entfernten Ports kombinieren + + + Windows Portlistensyntax verwenden + + + Windows Firewall Einstellungen + + + Alle löschen + + + Regeln in Windows löschen + + + Schnittstellentyp + + + Kabelgebunden + + + Kabellos + + + Fernzugriff + + + Geben Sie weniger als 10001 Ports oder Portbereiche an + + + Mindestens ein Netzwerkprofil muss gewählt werden. + + + Das Zeichen ‚|’ darf nicht enthalten sein solange das Firewallprofil aktiv ist. + + + Die Regel enthält einen Konfigurationsfehler + + + Wählen Sie ein Programm aus, das mit Pfad nicht länger als 256 Zeichen ist. + + + Eingebaverlauf der Ports löschen + + + Eingabeverlauf lokaler Ports löschen + + + Eingabeverlauf entfernter Ports löschen + + + Geben Sie positive Ganzzahl ein! + + + Maximale Länge von Porteinträgen + + + Firewall Regel hinzufügen + + + Ausgewählte oder letzte Firewall Regel löschen + + + Firewall Regeln anwenden + + + Alle Firewall Regeln löschen + + + NETworkManager Regeln in Windows Firewall löschen + + + Strg + + + Alt + + + Umschalt + + + Entf + + + Windows Firewall Einstellungen öffnen + + + Firewall Regeln + diff --git a/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx b/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx index 23854f94ed..89eeb8b7df 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.es-ES.resx @@ -3942,6 +3942,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3995,4 +3998,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Not configured + + + Outbound + + + Private + + + Prv + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx b/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx index 2a4853e8de..2e28af709f 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.fr-FR.resx @@ -3945,6 +3945,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3998,4 +4001,157 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Not configured + + + Outbound + + + Private + + + Prv + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx b/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx index 2c284cb0ac..03007c55cb 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.hu-HU.resx @@ -3945,6 +3945,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3998,4 +4001,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Private + + + Prv + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx b/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx index a338546f68..78965bd1cf 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.it-IT.resx @@ -4046,6 +4046,9 @@ Se selezioni 'Annulla', il file del profilo non verrà crittografato. Per applicare le modifiche come le impostazioni della lingua è necessario un riavvio. + + Network profile + Impossibile analizzare o risolvere nessuno dei server DNS specificati. @@ -4099,4 +4102,157 @@ Per migrare le impostazioni precedenti, se necessario, è possibile copiare il f er migrare le impostazioni precedenti, se necessario, è possibile copiare il file "settings.json" da "{0}" a "{1}". A questo scopo è necessario prima chiudere l'applicazione per evitare che le impostazioni vengano sovrascritte. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx b/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx index dc56abed5d..cab2821f14 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.ja-JP.resx @@ -3963,6 +3963,9 @@ Windows の「設定」>「プライバシーとセキュリティ」>「 この設定は管理者によって管理されています。 + + Network profile + 既定の場所を復元 @@ -3998,4 +4001,157 @@ Windows の「設定」>「プライバシーとセキュリティ」>「 必要に応じて、プロファイルファイルを “{0}” から “{1}” にコピーして、既存のプロファイルを移行できます。プロファイルが上書きされないように、この操作を行うにはアプリケーションを終了してください。 + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx b/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx index fd8e3b53c8..708e3b51e9 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.ko-KR.resx @@ -3942,6 +3942,9 @@ Windows 설정 > 개인정보 보호 및 보안 > 위치를 열고 데스 A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3995,4 +3998,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Delete selected or last firewall rule + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx b/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx index 5cfebe6423..88b3a79ee3 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.nl-NL.resx @@ -3942,6 +3942,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network connection profile + Could not parse or resolve any of the specified DNS servers. @@ -3995,4 +3998,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + ! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx b/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx index f532fbdbc6..7ac1497c82 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.pl-PL.resx @@ -3942,6 +3942,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3995,4 +3998,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Clear all firewall rules + + + Apply firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx b/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx index 076e3d56ac..e2971fad91 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.pt-BR.resx @@ -3963,6 +3963,9 @@ Se clicar em Cancelar, o arquivo de perfil permanecerá descriptografado. Esta configuração é gerenciada pelo seu administrador. + + Network profile + Restaurar local padrão @@ -3998,4 +4001,160 @@ Você pode copiar seus arquivos de perfil de "{0}" para "{1}" para migrar seus p Você pode copiar seus arquivos de perfil de "{0}" para "{1}" para migrar seus perfis existentes, se necessário. O aplicativo precisa ser fechado para prevenir que os perfis sejam sobrescritos. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index 7c2471b85e..c1a89c16c5 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -3945,6 +3945,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3998,4 +4001,166 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Not configured + + + Do not change system configuration + + + + + + Public + + + Private + + + Deselect + + + Direction + + + Local ports + + + Remote ports + + + Inbound + + + Outbound + + + Character ‘|’ is not allowed. + + + Prv + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + \ No newline at end of file diff --git a/Source/NETworkManager.Localization/Resources/Strings.ru-RU.resx b/Source/NETworkManager.Localization/Resources/Strings.ru-RU.resx index 9d958ae347..2330c046de 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.ru-RU.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.ru-RU.resx @@ -3998,4 +3998,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Network profile + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.sl-SI.resx b/Source/NETworkManager.Localization/Resources/Strings.sl-SI.resx index 0753b7a3f9..e69f0eeabd 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.sl-SI.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.sl-SI.resx @@ -3929,6 +3929,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network connection profile + Could not parse or resolve any of the specified DNS servers. @@ -3982,4 +3985,160 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Combine local and remote port history + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.sv-SE.resx b/Source/NETworkManager.Localization/Resources/Strings.sv-SE.resx index 5fbb3f403e..b31824c57d 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.sv-SE.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.sv-SE.resx @@ -3942,6 +3942,9 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + Could not parse or resolve any of the specified DNS servers. @@ -3995,4 +3998,157 @@ You can copy your profile files from “{0}” to “{1}” to migrate your exis You can copy your profile files from “{0}” to “{1}” to migrate your existing profiles, if necessary. The application must be closed for this to prevent the profiles from being overwritten. + + Network connection profile + + + Do not change system configuration + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Alt + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + diff --git a/Source/NETworkManager.Localization/Resources/Strings.uk-UA.resx b/Source/NETworkManager.Localization/Resources/Strings.uk-UA.resx index b4b3b9e5c3..bda4522422 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.uk-UA.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.uk-UA.resx @@ -3945,4 +3945,154 @@ If you click Cancel, the profile file will remain unencrypted. A restart is required to apply changes such as language settings. + + Network profile + + + Outbound + + + Prv + + + Private + + + Public + + + Remote ports + + + Direction + + + Local ports + + + Inbound + + + Not configured + + + Character ‘|’ is not allowed. + + + Allow + + + Block + + + Action + + + Enter path to *.exe file. + + + Select… + + + Description of the firewall rule + + + Pub + + + Dom + + + Input does exceed valid length + + + Firewall + + + Combine local and remote port history + + + Use Windows port list syntax + + + Windows firewall settings + + + Delete all + + + Clear rules in Windows + + + Interface type + + + Wired + + + Wireless + + + Remote access + + + Enter less than 10001 ports or port ranges + + + At least one network profile must be selected! + + + Character ‘|’ is not allowed while Firewall profile is enabled. + + + The rule has a configuration error + + + Choose a program that does not exceed 256 characters including path! + + + Erase port history + + + Erase the local port history + + + Erase the remote port history + + + Enter positive integer! + + + Maximum length of port entries + + + Add firewall rule + + + Delete selected or last firewall rule + + + Apply firewall rules + + + Clear all firewall rules + + + Clear NETworkManager rules in Windows firewall + + + Ctrl + + + Shift + + + Del + + + Open Windows firewall settings + + + Firewall rules + From be56e92c25ce82b69a7aa6a3aec817c79e0c3920 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 14:24:21 +0100 Subject: [PATCH 19/21] Add Firewall application. Signed-off-by: Manuel Ullmann --- .../BoolArrayToFwRuleCategoriesConverter.cs | 53 + .../EmptyToIntMaxValueConverter.cs | 34 + .../FirewallRuleProgramConverter.cs | 42 + .../IntZeroToFalseConverter.cs | 26 + .../NETworkManager.Converters.csproj | 1 + .../PortRangeToPortSpecificationConverter.cs | 60 + .../DocumentationIdentifier.cs | 7 +- .../DocumentationManager.cs | 4 + .../ViewModels/IFirewallRuleViewModel.cs | 30 + .../ViewModels/IFirewallViewModel.cs | 22 + .../ViewModels/IProfileViewModel.cs | 15 + .../ApplicationManager.cs | 3 + .../NETworkManager.Models/ApplicationName.cs | 7 +- .../Firewall/Firewall.cs | 139 ++ .../Firewall/FirewallInterfaceType.cs | 21 + .../Firewall/FirewallPortLocation.cs | 16 + .../Firewall/FirewallPortSpecification.cs | 65 + .../Firewall/FirewallProtocol.cs | 122 ++ .../Firewall/FirewallRule.cs | 135 ++ .../Firewall/FirewallRuleAction.cs | 19 + .../Firewall/FirewallRuleDirection.cs | 18 + .../Firewall/FirewallRuleProgram.cs | 77 + Source/NETworkManager.Profiles/ProfileInfo.cs | 11 +- Source/NETworkManager.Profiles/ProfileName.cs | 3 +- .../ProfileViewManager.cs | 2 + .../NETworkManager.Settings/SettingsInfo.cs | 89 ++ .../SettingsManager.cs | 6 + .../NETworkManager.Settings/SettingsName.cs | 3 +- .../SettingsViewManager.cs | 2 + .../NETworkManager.Utilities.WPF.csproj | 3 + .../FirewallViewModelProxy.cs | 36 + .../ProfileViewModelProxy.cs | 36 + .../AnyNetworkProfileValidator.cs | 40 + .../EmptyOrFileIsExeValidator.cs | 20 + .../EmptyOrFirewallPortRangeValidator.cs | 53 + .../FirewallRuleNameValidator.cs | 50 + .../FirewallRuleNoPipeValidator.cs | 38 + .../NETworkManager.Validators.csproj | 1 + .../ProgramNameLengthValidator.cs | 16 + Source/NETworkManager.sln | 22 + .../Controls/FirewallRuleEnumTranslations.cs | 35 + .../Controls/FirewallRuleGrid.xaml | 679 +++++++++ .../Controls/FirewallRuleGrid.xaml.cs | 393 +++++ Source/NETworkManager/MainWindow.xaml.cs | 22 +- Source/NETworkManager/NETworkManager.csproj | 9 + Source/NETworkManager/ProfileDialogManager.cs | 6 +- .../ViewModels/FirewallRuleViewModel.cs | 1049 +++++++++++++ .../ViewModels/FirewallSettingsViewModel.cs | 162 ++ .../ViewModels/FirewallViewModel.cs | 1325 +++++++++++++++++ .../ViewModels/ProfileViewModel.cs | 70 +- .../ViewModels/SettingsViewModel.cs | 6 + .../Views/FirewallSettingsView.xaml | 100 ++ .../Views/FirewallSettingsView.xaml.cs | 24 + Source/NETworkManager/Views/FirewallView.xaml | 982 ++++++++++++ .../NETworkManager/Views/FirewallView.xaml.cs | 81 + .../Views/ProfileChildWindow.xaml | 190 ++- .../Views/ProfileChildWindow.xaml.cs | 36 + Source/NETworkManager/Views/ProfilesView.xaml | 4 + Website/docs/application/firewall.md | 292 ++++ Website/docs/changelog/next-release.md | 16 +- Website/docs/img/firewall--addProfile.png | Bin 0 -> 102094 bytes Website/docs/img/firewall--mainview.png | Bin 0 -> 68660 bytes Website/docs/img/firewall--settings.png | Bin 0 -> 50096 bytes 63 files changed, 6802 insertions(+), 26 deletions(-) create mode 100644 Source/NETworkManager.Converters/BoolArrayToFwRuleCategoriesConverter.cs create mode 100644 Source/NETworkManager.Converters/EmptyToIntMaxValueConverter.cs create mode 100644 Source/NETworkManager.Converters/FirewallRuleProgramConverter.cs create mode 100644 Source/NETworkManager.Converters/IntZeroToFalseConverter.cs create mode 100644 Source/NETworkManager.Converters/PortRangeToPortSpecificationConverter.cs create mode 100644 Source/NETworkManager.Interfaces/ViewModels/IFirewallRuleViewModel.cs create mode 100644 Source/NETworkManager.Interfaces/ViewModels/IFirewallViewModel.cs create mode 100644 Source/NETworkManager.Interfaces/ViewModels/IProfileViewModel.cs create mode 100644 Source/NETworkManager.Models/Firewall/Firewall.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallProtocol.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallRule.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs create mode 100644 Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs create mode 100644 Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FirewallViewModelProxy.cs create mode 100644 Source/NETworkManager.Utilities.WPF/TypedBindingProxies/ProfileViewModelProxy.cs create mode 100644 Source/NETworkManager.Validators/AnyNetworkProfileValidator.cs create mode 100644 Source/NETworkManager.Validators/EmptyOrFileIsExeValidator.cs create mode 100644 Source/NETworkManager.Validators/EmptyOrFirewallPortRangeValidator.cs create mode 100644 Source/NETworkManager.Validators/FirewallRuleNameValidator.cs create mode 100644 Source/NETworkManager.Validators/FirewallRuleNoPipeValidator.cs create mode 100644 Source/NETworkManager.Validators/ProgramNameLengthValidator.cs create mode 100644 Source/NETworkManager/Controls/FirewallRuleEnumTranslations.cs create mode 100644 Source/NETworkManager/Controls/FirewallRuleGrid.xaml create mode 100644 Source/NETworkManager/Controls/FirewallRuleGrid.xaml.cs create mode 100644 Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs create mode 100644 Source/NETworkManager/ViewModels/FirewallSettingsViewModel.cs create mode 100644 Source/NETworkManager/ViewModels/FirewallViewModel.cs create mode 100644 Source/NETworkManager/Views/FirewallSettingsView.xaml create mode 100644 Source/NETworkManager/Views/FirewallSettingsView.xaml.cs create mode 100644 Source/NETworkManager/Views/FirewallView.xaml create mode 100644 Source/NETworkManager/Views/FirewallView.xaml.cs create mode 100644 Website/docs/application/firewall.md create mode 100644 Website/docs/img/firewall--addProfile.png create mode 100644 Website/docs/img/firewall--mainview.png create mode 100644 Website/docs/img/firewall--settings.png diff --git a/Source/NETworkManager.Converters/BoolArrayToFwRuleCategoriesConverter.cs b/Source/NETworkManager.Converters/BoolArrayToFwRuleCategoriesConverter.cs new file mode 100644 index 0000000000..9422e73ac9 --- /dev/null +++ b/Source/NETworkManager.Converters/BoolArrayToFwRuleCategoriesConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows.Data; +using NETworkManager.Models.Network; +using NETworkManager.Localization.Resources; + + +namespace NETworkManager.Converters; + +public class BoolArrayToFwRuleCategoriesConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType != typeof(string)) return null; + const int expectedLength = 3; + var fallback = GetTranslation(Enum.GetName(NetworkProfiles.NotConfigured), false); + if (value is not bool[] { Length: expectedLength } boolArray) + return fallback; + var result = string.Empty; + var numSelected = boolArray.CountAny(true); + switch (numSelected) + { + case 0: + return fallback; + case < 2: + return GetTranslation(Enum.GetName(typeof(NetworkProfiles), + Array.FindIndex(boolArray, b => b)), false); + } + + if (boolArray.All(b => b)) + return Strings.All; + + for (var i = 0; i < expectedLength; i++) + { + if (boolArray[i]) + result += $", {GetTranslation(Enum.GetName(typeof(NetworkProfiles), i), true)}"; + } + + return result[2..]; + + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + private static string GetTranslation(string key, bool trimmed) + { + return Strings.ResourceManager.GetString(trimmed ? $"{key}_Short3" : key, Strings.Culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/EmptyToIntMaxValueConverter.cs b/Source/NETworkManager.Converters/EmptyToIntMaxValueConverter.cs new file mode 100644 index 0000000000..87e9d60e81 --- /dev/null +++ b/Source/NETworkManager.Converters/EmptyToIntMaxValueConverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public class EmptyToIntMaxValueConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + const int fallback = int.MaxValue; + if (targetType == typeof(int)) + { + if (value is not string strValue) + return fallback; + if (string.IsNullOrWhiteSpace(strValue)) + return fallback; + if (!int.TryParse(strValue, out int parsedIntValue)) + return fallback; + return parsedIntValue; + } + + if (targetType != typeof(string)) + return null; + if (value is not int intValue) + return null; + return intValue is fallback ? string.Empty : intValue.ToString(); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/FirewallRuleProgramConverter.cs b/Source/NETworkManager.Converters/FirewallRuleProgramConverter.cs new file mode 100644 index 0000000000..1473956cdc --- /dev/null +++ b/Source/NETworkManager.Converters/FirewallRuleProgramConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.IO; +using System.Windows.Data; +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Converters; + +/// +/// Convert a program reference to a string and vice versa. +/// +public class FirewallRuleProgramConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType == typeof(FirewallRuleProgram)) + { + if (value is not string program) + return null; + if (string.IsNullOrWhiteSpace(program)) + return null; + try + { + var exe = new FirewallRuleProgram(program); + return exe; + } + catch (FileNotFoundException) + { + return null; + } + } + + if (targetType != typeof(string)) + return null; + return value is not FirewallRuleProgram prog ? null : prog.ToString(); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/IntZeroToFalseConverter.cs b/Source/NETworkManager.Converters/IntZeroToFalseConverter.cs new file mode 100644 index 0000000000..592da208fe --- /dev/null +++ b/Source/NETworkManager.Converters/IntZeroToFalseConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace NETworkManager.Converters; +/// +/// Convert a value of 0 to the boolean false. +/// +public class IntZeroToFalseConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value switch + { + null => false, + int i => i is not 0, + bool boolean => boolean ? 1 : 0, + _ => false + }; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/NETworkManager.Converters.csproj b/Source/NETworkManager.Converters/NETworkManager.Converters.csproj index 0457284fc5..8c721cf425 100644 --- a/Source/NETworkManager.Converters/NETworkManager.Converters.csproj +++ b/Source/NETworkManager.Converters/NETworkManager.Converters.csproj @@ -20,6 +20,7 @@ + diff --git a/Source/NETworkManager.Converters/PortRangeToPortSpecificationConverter.cs b/Source/NETworkManager.Converters/PortRangeToPortSpecificationConverter.cs new file mode 100644 index 0000000000..15c6b6a08d --- /dev/null +++ b/Source/NETworkManager.Converters/PortRangeToPortSpecificationConverter.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Windows.Data; +using NETworkManager.Models.Firewall; +using NETworkManager.Settings; + +namespace NETworkManager.Converters; + +/// +/// Converts a port range or port to an instance of FirewallPortSpecification. +/// +public class PortRangeToPortSpecificationConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + char portDelimiter = SettingsManager.Current.Firewall_UseWindowsPortSyntax ? ',' : ';'; + if (targetType == typeof(List)) + { + if (value is not string input) + return null; + const char rangeDelimiter = '-'; + List resultList = []; + var portList = input.Split(portDelimiter); + foreach (var port in portList) + { + if (port.Contains(rangeDelimiter)) + { + var portRange = port.Split(rangeDelimiter); + if (!int.TryParse(portRange[0], out var startPort)) + return null; + if (!int.TryParse(portRange[1], out var endPort)) + return null; + resultList.Add(new FirewallPortSpecification(startPort, endPort)); + } + else + { + if (!int.TryParse(port, out var portNumber)) + return null; + resultList.Add(new FirewallPortSpecification(portNumber)); + } + } + return resultList; + } + + if (targetType != typeof(string)) + return null; + if (value is not List portSpecs) + return string.Empty; + string result = portSpecs + .Aggregate("", (current, portSpecification) => current + $"{portSpecification}{portDelimiter} "); + return result.Length > 0 ? result[..^2] : string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType, parameter, culture); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Documentation/DocumentationIdentifier.cs b/Source/NETworkManager.Documentation/DocumentationIdentifier.cs index f3e526f3a6..2bea0cb27d 100644 --- a/Source/NETworkManager.Documentation/DocumentationIdentifier.cs +++ b/Source/NETworkManager.Documentation/DocumentationIdentifier.cs @@ -134,7 +134,12 @@ public enum DocumentationIdentifier /// ARP Table documentation page. /// ApplicationArpTable, - + + /// + /// Firewall documentation page. + /// + ApplicationFirewall, + /// /// Settings\General documentation page. /// diff --git a/Source/NETworkManager.Documentation/DocumentationManager.cs b/Source/NETworkManager.Documentation/DocumentationManager.cs index 130ead18c0..6aa2653411 100644 --- a/Source/NETworkManager.Documentation/DocumentationManager.cs +++ b/Source/NETworkManager.Documentation/DocumentationManager.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; using System.Windows.Input; using NETworkManager.Models; using NETworkManager.Settings; @@ -96,6 +97,9 @@ public static class DocumentationManager new DocumentationInfo(DocumentationIdentifier.ApplicationArpTable, @"docs/application/arp-table"), + + new DocumentationInfo(DocumentationIdentifier.ApplicationFirewall, + @"docs/application/firewall"), new DocumentationInfo(DocumentationIdentifier.SettingsGeneral, @"docs/settings/general"), diff --git a/Source/NETworkManager.Interfaces/ViewModels/IFirewallRuleViewModel.cs b/Source/NETworkManager.Interfaces/ViewModels/IFirewallRuleViewModel.cs new file mode 100644 index 0000000000..4c60df642e --- /dev/null +++ b/Source/NETworkManager.Interfaces/ViewModels/IFirewallRuleViewModel.cs @@ -0,0 +1,30 @@ +using NETworkManager.Models.Firewall; + +namespace NETworkManager.Interfaces.ViewModels; + +/// +/// Interface to allow converters and validators access to the firewall rule view model, +/// in this case validating with the other network profile checkboxes. +/// +public interface IFirewallRuleViewModel +{ + public bool NetworkProfileDomain { get; } + + public bool NetworkProfilePrivate { get; } + + public bool NetworkProfilePublic { get; } + + public List? LocalPorts { get; } + + public List? RemotePorts { get; } + + public FirewallRuleProgram? Program { get; } + + public int MaxLengthName { get; } + + public string? UserDefinedName { get; } + + public bool NameHasError { get; set; } + + public bool HasError { get; } +} \ No newline at end of file diff --git a/Source/NETworkManager.Interfaces/ViewModels/IFirewallViewModel.cs b/Source/NETworkManager.Interfaces/ViewModels/IFirewallViewModel.cs new file mode 100644 index 0000000000..f9054606db --- /dev/null +++ b/Source/NETworkManager.Interfaces/ViewModels/IFirewallViewModel.cs @@ -0,0 +1,22 @@ +using System.Collections.ObjectModel; +using System.Windows.Input; + +namespace NETworkManager.Interfaces.ViewModels; + +public interface IFirewallViewModel +{ + public ObservableCollection FirewallRulesInterface { get; } + + public ICommand ExpandAllProfileGroupsCommand { get; } + + public ICommand CollapseAllProfileGroupsCommand { get; } + + public int MaxLengthHistory { get; } + + public static IFirewallViewModel? Instance { get; set; } + + public static void SetInstance(IFirewallViewModel? viewModel) + { + Instance = viewModel; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Interfaces/ViewModels/IProfileViewModel.cs b/Source/NETworkManager.Interfaces/ViewModels/IProfileViewModel.cs new file mode 100644 index 0000000000..86f46df54f --- /dev/null +++ b/Source/NETworkManager.Interfaces/ViewModels/IProfileViewModel.cs @@ -0,0 +1,15 @@ +namespace NETworkManager.Interfaces.ViewModels; + +// ReSharper disable InconsistentNaming +public interface IProfileViewModel +{ + #region General + public string Name { get; } + #endregion + + #region Firewall + public bool Firewall_Enabled { get; set; } + + public IFirewallViewModel Firewall_IViewModel { get; set; } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/ApplicationManager.cs b/Source/NETworkManager.Models/ApplicationManager.cs index 83c8d28420..8270954762 100644 --- a/Source/NETworkManager.Models/ApplicationManager.cs +++ b/Source/NETworkManager.Models/ApplicationManager.cs @@ -121,6 +121,9 @@ public static Canvas GetIcon(ApplicationName name) case ApplicationName.ARPTable: canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.TableOfContents }); break; + case ApplicationName.Firewall: + canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.WallFire }); + break; case ApplicationName.None: default: canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.SmileyFrown }); diff --git a/Source/NETworkManager.Models/ApplicationName.cs b/Source/NETworkManager.Models/ApplicationName.cs index 7d4a201dee..f31da2c258 100644 --- a/Source/NETworkManager.Models/ApplicationName.cs +++ b/Source/NETworkManager.Models/ApplicationName.cs @@ -145,5 +145,10 @@ public enum ApplicationName /// /// ARP table application. /// - ARPTable + ARPTable, + + /// + /// Firewall application. + /// + Firewall, } \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/Firewall.cs b/Source/NETworkManager.Models/Firewall/Firewall.cs new file mode 100644 index 0000000000..594ca8951f --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/Firewall.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using log4net; +using NETworkManager.Models.Network; +using NETworkManager.Utilities; + +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a firewall configuration and management class that provides functionalities +/// for applying and managing firewall rules based on a specified profile. +/// +public class Firewall +{ + #region Variables + + /// + /// The Logger. + /// + private readonly ILog _logger = LogManager.GetLogger(typeof(Firewall)); + + #endregion + + #region Methods + + /// + /// Applies the firewall rules specified in the list to the system's firewall settings. + /// + /// A list of objects representing the firewall rules to be applied. + /// Returns true if the rules were successfully applied; otherwise, false. + private bool ApplyRules(List rules) + { + string command = GetClearAllRulesCommand(); + if (rules.Count is 0) + return true; + command += "; "; + foreach (FirewallRule rule in rules) + { + string nextRule = string.Empty; + try + { + nextRule += $"New-NetFirewallRule -DisplayName '{rule.Name}'"; + if (!string.IsNullOrEmpty(rule.Description)) + nextRule += $" -Description '{rule.Description}'"; + nextRule += $" -Direction {Enum.GetName(rule.Direction)}"; + if (rule.LocalPorts.Count > 0 + && rule.Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP) + { + nextRule += $" -LocalPort {FirewallRule.PortsToString(rule.LocalPorts, ',', false)}"; + } + + if (rule.RemotePorts.Count > 0 + && rule.Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP) + nextRule += $" -RemotePort {FirewallRule.PortsToString(rule.RemotePorts, ',', false)}"; + if (rule.Protocol is FirewallProtocol.Any) + nextRule += $" -Protocol Any"; + else + nextRule += $" -Protocol {(int)rule.Protocol}"; + if (!string.IsNullOrWhiteSpace(rule.Program?.Name)) + { + try + { + if (File.Exists(rule.Program.Name)) + nextRule += $" -Program '{rule.Program.Name}'"; + else + continue; + } + catch + { + continue; + } + } + + if (rule.InterfaceType is not FirewallInterfaceType.Any) + nextRule += $" -InterfaceType {Enum.GetName(rule.InterfaceType)}"; + if (!rule.NetworkProfiles.All(x => x)) + { + nextRule += $" -Profile "; + for (int i = 0; i < rule.NetworkProfiles.Length; i++) + { + if (rule.NetworkProfiles[i]) + nextRule += $"{Enum.GetName(typeof(NetworkProfiles), i)},"; + } + nextRule = nextRule[..^1]; + } + nextRule += $" -Action {Enum.GetName(rule.Action)}; "; + command += nextRule; + } + catch (ArgumentException) + { + } + } + + command = command[..^2]; + try + { + _logger.Info($"[Firewall] Applying rules:{Environment.NewLine}{command}"); + PowerShellHelper.ExecuteCommand(command, true); + } + catch (Exception) + { + return false; + } + + return true; + } + + /// + /// Removes all existing firewall rules associated with the specified profile. + /// + /// + /// This method clears all configured firewall rules for the current profile. + /// It is useful for resetting the rules to a clean state. Errors or exceptions + /// during the operation are logged using the configured logging mechanism. + /// + public static void ClearAllRules() + { + PowerShellHelper.ExecuteCommand($"{GetClearAllRulesCommand()}", true); + } + + private static string GetClearAllRulesCommand() + { + return $"Remove-NetFirewallRule -DisplayName 'NwM_*'"; + } + + /// + /// Applies firewall rules asynchronously by invoking the ApplyRules method in a separate task. + /// + /// A list of firewall rules to apply. + /// A task representing the asynchronous operation. The task result contains a boolean indicating whether the rules were successfully applied. + public async Task ApplyRulesAsync(List rules) + { + return await Task.Run(() => ApplyRules(rules)); + } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs b/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs new file mode 100644 index 0000000000..0b1fea53eb --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallInterfaceType.cs @@ -0,0 +1,21 @@ +namespace NETworkManager.Models.Firewall; + +public enum FirewallInterfaceType +{ + /// + /// Any interface type. + /// + Any = -1, + /// + /// Wired interface types, e.g. Ethernet. + /// + Wired, + /// + /// Wireless interface types, e.g. Wi-Fi. + /// + Wireless, + /// + /// Remote interface types, e.g. VPN, L2TP, OpenVPN, etc. + /// + RemoteAccess +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs b/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs new file mode 100644 index 0000000000..104e5655d8 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallPortLocation.cs @@ -0,0 +1,16 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Ports of local host or remote host. +/// +public enum FirewallPortLocation +{ + /// + /// Ports of local host. + /// + LocalPorts, + /// + /// Ports of remote host. + /// + RemotePorts +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs b/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs new file mode 100644 index 0000000000..15c55fdd41 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallPortSpecification.cs @@ -0,0 +1,65 @@ +// ReSharper disable MemberCanBePrivate.Global +// Needed for serialization. +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a specification for defining and validating firewall ports. +/// +/// +/// This class is used to encapsulate rules and configurations for +/// managing firewall port restrictions or allowances. It provides +/// properties and methods to define a range of acceptable ports or +/// individual port specifications. +/// +public class FirewallPortSpecification +{ + /// + /// Gets or sets the start point or initial value of a process, range, or operation. + /// + /// + /// The Start property typically represents the beginning state or position for sequential + /// processing or iteration. The exact usage of this property may vary depending on the context of + /// the class or object it belongs to. + /// + public int Start { get; set; } + + /// + /// Gets or sets the endpoint or final state of a process, range, or operation. + /// + /// + /// This property typically represents the termination position, time, or value + /// in a sequence, operation, or any bounded context. Its specific meaning may vary + /// depending on the context in which it is used. + /// + public int End { get; set; } + + /// + /// For serializing. + /// + public FirewallPortSpecification() + { + Start = -1; + End = -1; + } + + /// + /// Represents the specification for a firewall port, detailing its configuration + /// and rules for inbound or outbound network traffic. + /// + public FirewallPortSpecification(int start, int end = -1) + { + Start = start; + End = end; + } + + /// + /// Returns a string that represents the current object. + /// + /// A string that represents the current instance of the object. + public override string ToString() + { + if (Start is 0) + return string.Empty; + return End is -1 or 0 ? $"{Start}" : $"{Start}-{End}"; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs b/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs new file mode 100644 index 0000000000..da54f95e6e --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallProtocol.cs @@ -0,0 +1,122 @@ +// ReSharper disable InconsistentNaming +namespace NETworkManager.Models.Firewall; + +/// +/// Specifies the network protocols supported by the firewall configuration. +/// Each protocol is represented by its respective protocol number as defined in +/// the Internet Assigned Numbers Authority (IANA) protocol registry. +/// This enumeration is used to identify traffic based on its protocol type +/// for filtering or access control purposes in the firewall. +/// +public enum FirewallProtocol +{ + /// + /// Denotes the Transmission Control Protocol (TCP) used in firewall configurations. + /// TCP is a fundamental protocol within the Internet Protocol Suite, ensuring reliable + /// communication by delivering a stream of data packets in sequence with error checking + /// between networked devices. + /// + TCP = 6, + + /// + /// Represents the User Datagram Protocol (UDP) in the context of firewall rules. + /// UDP is a connectionless protocol within the Internet Protocol (IP) suite that + /// allows for minimal latency by transmitting datagrams without guaranteeing delivery, + /// order, or error recovery. + /// + UDP = 17, + + /// + /// Represents the Internet Control Message Protocol (ICMPv4) in the context of firewall rules. + /// ICMP is used by network devices, such as routers, to send error messages and operational + /// information, indicating issues like unreachable network destinations. + /// + ICMPv4 = 1, + + /// + /// Represents the Internet Control Message Protocol for IPv6 (ICMPv6) in the context of firewall rules. + /// ICMPv6 is a supporting protocol in the Internet Protocol version 6 (IPv6) suite and is used for + /// diagnostic and error-reporting purposes, as well as for functions such as Neighbor Discovery Protocol (NDP). + /// + ICMPv6 = 58, + + /// + /// Represents the IPv6 Hop-by-Hop Option (HOPOPT) protocol in the context of firewall rules. + /// HOPOPT is a special protocol used in IPv6 for carrying optional information that must be examined + /// by each node along the packet's delivery path. + /// + HOPOPT = 0, + + /// + /// Represents the Generic Routing Encapsulation (GRE) protocol in the context of firewall rules. + /// GRE is a tunneling protocol developed to encapsulate a wide variety of network layer protocols + /// inside virtual point-to-point links. It is commonly used in creating VPNs and enabling the + /// transport of multicast traffic and non-IP protocols across IP networks. + /// + GRE = 47, + + /// + /// Represents the Internet Protocol Version 6 (IPv6) in the context of firewall rules. + /// IPv6 is the most recent version of the Internet Protocol (IP) and provides identification + /// and location addressing for devices across networks, enabling communication over the internet. + /// + IPv6 = 41, + + /// + /// Represents the IPv6-Route protocol in the context of firewall rules. + /// IPv6-Route is used for routing header information in IPv6 packets, which + /// specifies the list of one or more intermediate nodes a packet should pass + /// through before reaching its destination. + /// + IPv6_Route = 43, + + /// + /// Represents the IPv6 Fragmentation Header (IPv6_Frag) in the context of firewall rules. + /// The IPv6 Fragmentation Header is used to support fragmentation and reassembly of + /// packets in IPv6 networks. It facilitates handling packets that are too large to + /// fit in the path MTU (Maximum Transmission Unit) of the network segment. + /// + IPv6_Frag = 44, + + /// + /// Represents the IPv6 No Next Header protocol in the context of firewall rules. + /// This protocol indicates that there is no next header following the current header in the IPv6 packet. + /// It is primarily used in cases where the payload does not require a specific transport protocol header. + /// + IPv6_NoNxt = 59, + + /// + /// Represents the IPv6 Options (IPv6_Opts) protocol in the context of firewall rules. + /// IPv6 Options is a part of the IPv6 suite used for carrying optional internet-layer information + /// and additional headers for specific purposes, providing extensibility in IPv6 communication. + /// + IPv6_Opts = 60, + + /// + /// Represents the Virtual Router Redundancy Protocol (VRRP) in the context of firewall rules. + /// VRRP is a network protocol that provides automatic assignment of available routers to + /// participating hosts, ensuring redundancy and high availability of router services. + /// + VRRP = 112, + + /// + /// Represents the Pragmatic General Multicast (PGM) protocol in the context of firewall rules. + /// PGM is a reliable multicast transport protocol that ensures ordered, duplicate-free, + /// and scalable delivery of data in multicast-enabled networks. + /// + PGM = 113, + + /// + /// Represents the Layer 2 Tunneling Protocol (L2TP) in the context of firewall rules. + /// L2TP is a tunneling protocol used to support virtual private networks (VPNs) or + /// as part of the delivery of services by Internet Service Providers (ISPs). + /// + L2TP = 115, + + /// + /// Represents a wildcard protocol option to match any protocol in the context of firewall rules. + /// The "Any" value can be used to specify that the rule applies to all network protocols + /// without restriction or specificity. + /// + Any = 255 +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRule.cs b/Source/NETworkManager.Models/Firewall/FirewallRule.cs new file mode 100644 index 0000000000..1cbba8a739 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRule.cs @@ -0,0 +1,135 @@ +using System.Collections.Generic; +using System.Text; + +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a security rule used within a firewall to control network traffic based on +/// specific conditions such as IP addresses, ports, and protocols. +/// +public class FirewallRule +{ + #region Variables + + /// + /// Represents the name associated with the object. + /// + /// + /// This property is used to identify the object with a descriptive, human-readable name. + /// The value of this property is typically a string and can be used for display purposes + /// or as an identifier in various contexts. + /// + public string Name { get; set; } + + /// + /// Represents a text-based explanation or information associated with an object. + /// + public string Description { get; set; } + + /// + /// Represents the communication protocol to be used in the network configuration. + /// + public FirewallProtocol Protocol { get; set; } = FirewallProtocol.TCP; + + /// + /// Defines the direction of traffic impacted by the rule or configuration. + /// + public FirewallRuleDirection Direction { get; set; } = FirewallRuleDirection.Inbound; + + /// + /// Represents the entry point and core execution logic for an application. + /// + public FirewallRuleProgram Program { get; set; } + + /// + /// Defines the local ports associated with the firewall rule. + /// + public List LocalPorts + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Defines the range of remote ports associated with the firewall rule. + /// + public List RemotePorts + { + get; + set + { + if (value is null) + { + field = []; + return; + } + field = value; + } + } = []; + + /// + /// Network profiles in order Domain, Private, Public. + /// + public bool[] NetworkProfiles + { + get; + set + { + if (value?.Length is not 3) + return; + field = value; + } + } = new bool[3]; + + public FirewallInterfaceType InterfaceType { get; set; } = FirewallInterfaceType.Any; + + /// + /// Represents the operation to be performed or executed. + /// + public FirewallRuleAction Action { get; set; } = FirewallRuleAction.Block; + + #endregion + + #region Constructors + + /// + /// Represents a rule within the firewall configuration. + /// Used to control network traffic based on specified criteria, such as + /// ports, protocols, the interface type, network profiles, and the used programs. + /// + public FirewallRule() + { + } + #endregion + + #region Methods + + /// + /// Converts a collection of port numbers to a single, comma-separated string representation. + /// + /// A collection of integers representing port numbers. + /// Separator character to use + /// Separate entries with a space. + /// A separated string containing all the port numbers from the input collection. + public static string PortsToString(List ports, char separator = ';', + bool spacing = true) + { + if (ports.Count is 0) + return string.Empty; + string whitespace = spacing ? " " : string.Empty; + var builder = new StringBuilder(); + foreach (var port in ports) + builder.Append($"{port}{separator}{whitespace}"); + int offset = spacing ? 2 : 1; + return builder.ToString()[..^offset]; + } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs new file mode 100644 index 0000000000..23400c3e44 --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleAction.cs @@ -0,0 +1,19 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Represents the action, if the rule filter applies. +/// +public enum FirewallRuleAction +{ + /// + /// Represents the action to block network traffic in a firewall rule. + /// + Block, + + /// + /// Represents the action to allow network traffic. + /// + Allow, + // Unsupported for now + //AllowIPsec +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs new file mode 100644 index 0000000000..ddd72c116f --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleDirection.cs @@ -0,0 +1,18 @@ +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a firewall rule direction that allows or processes network traffic +/// incoming to the system or network from external sources. +/// +public enum FirewallRuleDirection +{ + /// + /// Inbound packets. + /// + Inbound, + + /// + /// Outbound packets. + /// + Outbound +} \ No newline at end of file diff --git a/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs b/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs new file mode 100644 index 0000000000..11a6afddfb --- /dev/null +++ b/Source/NETworkManager.Models/Firewall/FirewallRuleProgram.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using System.Text.Json.Serialization; +using System.Xml.Serialization; + +namespace NETworkManager.Models.Firewall; + +/// +/// Represents a program associated with a firewall rule. +/// +public class FirewallRuleProgram : ICloneable +{ + #region Variables + /// + /// Program to apply rule to. + /// + [JsonIgnore] + [XmlIgnore] + public FileInfo Executable { private set; get; } + + public string Name + { + get; + set + { + if (string.IsNullOrWhiteSpace(value)) + return; + Executable = new FileInfo(value); + if (!Executable.Exists) + return; + field = value; + } + } + + #endregion + + #region Constructor + /// + /// Required for serialization. + /// + public FirewallRuleProgram() + { + } + + /// + /// Construct program reference for firewall rule. + /// + /// + public FirewallRuleProgram(string pathToExe) + { + var exe = new FileInfo(pathToExe ?? string.Empty); + Executable = exe; + Name = exe.FullName; + } + #endregion + + #region Methods + /// + /// Convert the full file path to string. + /// + /// + public override string ToString() + { + return Executable?.FullName; + } + + /// + /// Clone instance. + /// + /// An instance clone. + public object Clone() + { + return new FirewallRuleProgram(Executable?.FullName); + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileInfo.cs b/Source/NETworkManager.Profiles/ProfileInfo.cs index a31a345b77..b02838d1e9 100644 --- a/Source/NETworkManager.Profiles/ProfileInfo.cs +++ b/Source/NETworkManager.Profiles/ProfileInfo.cs @@ -1,4 +1,5 @@ -using NETworkManager.Controls; +using System.Collections.Generic; +using NETworkManager.Controls; using NETworkManager.Models.Network; using NETworkManager.Models.PowerShell; using NETworkManager.Models.PuTTY; @@ -6,6 +7,7 @@ using NETworkManager.Settings; using System.Security; using System.Xml.Serialization; +using NETworkManager.Models.Firewall; // ReSharper disable InconsistentNaming // ReSharper disable PropertyCanBeMadeInitOnly.Global @@ -230,6 +232,10 @@ public ProfileInfo(ProfileInfo profile) IPGeolocation_Enabled = profile.IPGeolocation_Enabled; IPGeolocation_InheritHost = profile.IPGeolocation_InheritHost; IPGeolocation_Host = profile.IPGeolocation_Host; + + // Firewall + Firewall_Enabled = profile.Firewall_Enabled; + Firewall_Rules = profile.Firewall_Rules; } /// @@ -473,4 +479,7 @@ public ProfileInfo(ProfileInfo profile) public bool IPGeolocation_Enabled { get; set; } public bool IPGeolocation_InheritHost { get; set; } = true; public string IPGeolocation_Host { get; set; } + + public bool Firewall_Enabled { get; set; } + public List Firewall_Rules { get; set; } } \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileName.cs b/Source/NETworkManager.Profiles/ProfileName.cs index 3a8ee604db..7e9d5ef6f1 100644 --- a/Source/NETworkManager.Profiles/ProfileName.cs +++ b/Source/NETworkManager.Profiles/ProfileName.cs @@ -17,5 +17,6 @@ public enum ProfileName SNMP, WakeOnLAN, Whois, - IPGeolocation + IPGeolocation, + Firewall } \ No newline at end of file diff --git a/Source/NETworkManager.Profiles/ProfileViewManager.cs b/Source/NETworkManager.Profiles/ProfileViewManager.cs index 77d685dbac..c31e8558ca 100644 --- a/Source/NETworkManager.Profiles/ProfileViewManager.cs +++ b/Source/NETworkManager.Profiles/ProfileViewManager.cs @@ -43,6 +43,8 @@ public static class ProfileViewManager new ProfileViewInfo(ProfileName.Whois, ApplicationManager.GetIcon(ApplicationName.Whois), ProfileGroup.Application), new ProfileViewInfo(ProfileName.IPGeolocation, ApplicationManager.GetIcon(ApplicationName.IPGeolocation), + ProfileGroup.Application), + new ProfileViewInfo(ProfileName.Firewall, ApplicationManager.GetIcon(ApplicationName.Firewall), ProfileGroup.Application) }; } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs index 01f641b0b4..3367e44ba7 100644 --- a/Source/NETworkManager.Settings/SettingsInfo.cs +++ b/Source/NETworkManager.Settings/SettingsInfo.cs @@ -9,11 +9,13 @@ using NETworkManager.Models.RemoteDesktop; using NETworkManager.Utilities; using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Text.Json.Serialization; +using NETworkManager.Models.Firewall; // ReSharper disable InconsistentNaming @@ -4496,6 +4498,93 @@ public ExportFileType ARPTable_ExportFileType #endregion + /// + /// Settings for the application. + /// See for details. + /// + #region Firewall + + public bool Firewall_CombinePortHistory + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = true; + + public bool Firewall_UseWindowsPortSyntax + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } = false; + + public List Firewall_LocalPortsHistoryConfig { get; set; } + + public List Firewall_RemotePortsHistoryConfig { get; set; } + + public List Firewall_FirewallRules + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + public int Firewall_MaxLengthHistory + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + public bool Firewall_ExpandProfileView + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Profile_ExpandProfileView; + + public double Firewall_ProfileWidth + { + get; + set + { + if (Math.Abs(value - field) < GlobalStaticConfiguration.Profile_FloatPointFix) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Profile_DefaultWidthExpanded; + + #endregion + #endregion #region Constructor diff --git a/Source/NETworkManager.Settings/SettingsManager.cs b/Source/NETworkManager.Settings/SettingsManager.cs index d3b7809284..158062727a 100644 --- a/Source/NETworkManager.Settings/SettingsManager.cs +++ b/Source/NETworkManager.Settings/SettingsManager.cs @@ -673,6 +673,12 @@ private static void UpgradeTo_2026_2_22_0() private static void UpgradeToLatest(Version version) { Log.Info($"Apply upgrade to {version}..."); + + Log.Info($"Add new app {nameof(ApplicationName.Firewall)}."); + + Current.General_ApplicationList.Insert( + ApplicationManager.GetDefaultList().ToList().FindIndex(x => x.Name == ApplicationName.Firewall), + ApplicationManager.GetDefaultList().First(x => x.Name == ApplicationName.Firewall)); } #endregion } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsName.cs b/Source/NETworkManager.Settings/SettingsName.cs index f79a5db65f..7f60036aa9 100644 --- a/Source/NETworkManager.Settings/SettingsName.cs +++ b/Source/NETworkManager.Settings/SettingsName.cs @@ -27,5 +27,6 @@ public enum SettingsName SNMP, SNTPLookup, WakeOnLAN, - BitCalculator + BitCalculator, + Firewall } \ No newline at end of file diff --git a/Source/NETworkManager.Settings/SettingsViewManager.cs b/Source/NETworkManager.Settings/SettingsViewManager.cs index c12a94d199..56eec74cc3 100644 --- a/Source/NETworkManager.Settings/SettingsViewManager.cs +++ b/Source/NETworkManager.Settings/SettingsViewManager.cs @@ -64,6 +64,8 @@ public static class SettingsViewManager new SettingsViewInfo(SettingsName.WakeOnLAN, ApplicationManager.GetIcon(ApplicationName.WakeOnLAN), SettingsGroup.Application), new SettingsViewInfo(SettingsName.BitCalculator, ApplicationManager.GetIcon(ApplicationName.BitCalculator), + SettingsGroup.Application), + new SettingsViewInfo(SettingsName.Firewall, ApplicationManager.GetIcon(ApplicationName.Firewall), SettingsGroup.Application) }; } \ No newline at end of file diff --git a/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj b/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj index 06652b0713..98eaffd891 100644 --- a/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj +++ b/Source/NETworkManager.Utilities.WPF/NETworkManager.Utilities.WPF.csproj @@ -18,4 +18,7 @@ + + + diff --git a/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FirewallViewModelProxy.cs b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FirewallViewModelProxy.cs new file mode 100644 index 0000000000..5e9d4cd5c3 --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/FirewallViewModelProxy.cs @@ -0,0 +1,36 @@ +using System.Windows; +using NETworkManager.Interfaces.ViewModels; + +namespace NETworkManager.Utilities.WPF.TypedBindingProxies; + +/// +/// Binding proxy for s. +/// +public class FirewallViewModelProxy : Freezable +{ + /// + /// Dependency property used to hold a generic object. + /// This property allows data binding scenarios where a proxy + /// is required to transfer data between binding contexts. + /// + public static readonly DependencyProperty DataProperty = + DependencyProperty.Register(nameof(Data), typeof(IFirewallViewModel), typeof(FirewallViewModelProxy)); + + /// + /// Gets or sets the data object used for binding in WPF applications. + /// + public IFirewallViewModel Data + { + get => (IFirewallViewModel)GetValue(DataProperty); + set => SetValue(DataProperty, value); + } + + /// Creates a new instance of the BindingProxy class. + /// + /// A new instance of the BindingProxy class. + /// + protected override Freezable CreateInstanceCore() + { + return new BindingProxy(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/ProfileViewModelProxy.cs b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/ProfileViewModelProxy.cs new file mode 100644 index 0000000000..64631c406a --- /dev/null +++ b/Source/NETworkManager.Utilities.WPF/TypedBindingProxies/ProfileViewModelProxy.cs @@ -0,0 +1,36 @@ +using System.Windows; +using NETworkManager.Interfaces.ViewModels; + +namespace NETworkManager.Utilities.WPF.TypedBindingProxies; + +/// +/// Binding proxy for s. +/// +public class ProfileViewModelProxy : Freezable +{ + /// + /// Dependency property used to hold a generic object. + /// This property allows data binding scenarios where a proxy + /// is required to transfer data between binding contexts. + /// + public static readonly DependencyProperty DataProperty = + DependencyProperty.Register(nameof(Data), typeof(IProfileViewModel), typeof(ProfileViewModelProxy)); + + /// + /// Gets or sets the data object used for binding in WPF applications. + /// + public IProfileViewModel Data + { + get => (IProfileViewModel)GetValue(DataProperty); + set => SetValue(DataProperty, value); + } + + /// Creates a new instance of the BindingProxy class. + /// + /// A new instance of the BindingProxy class. + /// + protected override Freezable CreateInstanceCore() + { + return new BindingProxy(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/AnyNetworkProfileValidator.cs b/Source/NETworkManager.Validators/AnyNetworkProfileValidator.cs new file mode 100644 index 0000000000..0844545275 --- /dev/null +++ b/Source/NETworkManager.Validators/AnyNetworkProfileValidator.cs @@ -0,0 +1,40 @@ +using System.Globalization; +using System.Linq; +using System.Windows.Controls; +using System.Windows.Data; +using NETworkManager.Localization.Resources; +using NETworkManager.Interfaces.ViewModels; + +namespace NETworkManager.Validators; + +/// +/// Checks for any network profile to be selected. +/// +/// +/// Has to be called in ValidationStep.UpdatedValue or later. This means that the value update cannot be prevented, +/// however, we can still show the configuration error. +/// +public class AnyNetworkProfileValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var bindingExpression = value as BindingExpression; + if (bindingExpression?.DataItem is not IFirewallRuleViewModel viewModel) + { + return new ValidationResult(false, + "No ViewModel could be found. Is the ValidationStep set correctly?"); + } + if (bindingExpression.DataItem is true) + return ValidationResult.ValidResult; + + bool[] currentValues = + [ + viewModel.NetworkProfileDomain, + viewModel.NetworkProfilePrivate, + viewModel.NetworkProfilePublic + ]; + + return currentValues.Any(x => x) ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.AtLeastOneNetworkProfileMustBeSelected); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrFileIsExeValidator.cs b/Source/NETworkManager.Validators/EmptyOrFileIsExeValidator.cs new file mode 100644 index 0000000000..69e2dd05f1 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrFileIsExeValidator.cs @@ -0,0 +1,20 @@ +using System; +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +/// +/// Evaluate whether the file path is a *.exe or *.EXE file. +/// +public class EmptyOrFileIsExeValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (value is not string strVal || string.IsNullOrEmpty(strVal) + || strVal.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) + return ValidationResult.ValidResult; + return new ValidationResult(false, Strings.EnterPathToExe); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/EmptyOrFirewallPortRangeValidator.cs b/Source/NETworkManager.Validators/EmptyOrFirewallPortRangeValidator.cs new file mode 100644 index 0000000000..f25f9bda61 --- /dev/null +++ b/Source/NETworkManager.Validators/EmptyOrFirewallPortRangeValidator.cs @@ -0,0 +1,53 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; +using NETworkManager.Settings; + +namespace NETworkManager.Validators; + +public class EmptyOrFirewallPortRangeValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (string.IsNullOrEmpty(value as string)) + return ValidationResult.ValidResult; + + var isValid = true; + char portSeparator = SettingsManager.Current.Firewall_UseWindowsPortSyntax ? ',' : ';'; + var portList = ((string)value).Replace(" ", "").Split(portSeparator); + if (portList.Length > 10000) + return new ValidationResult(false, Strings.EnterLessThan10001PortsOrPortRanges); + foreach (var portOrRange in portList) + if (portOrRange.Contains('-')) + { + var portRange = portOrRange.Split('-'); + + if (int.TryParse(portRange[0], out var startPort) && int.TryParse(portRange[1], out var endPort)) + { + if (startPort is < 0 or > 65536 || endPort is < 0 or > 65536 && + startPort > endPort) + isValid = false; + } + else + { + isValid = false; + } + } + else + { + if (int.TryParse(portOrRange, out var portNumber)) + { + if (portNumber is <= 0 or >= 65536) + isValid = false; + } + else + { + isValid = false; + } + } + + return isValid + ? ValidationResult.ValidResult + : new ValidationResult(false, Strings.EnterValidPortOrPortRange); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FirewallRuleNameValidator.cs b/Source/NETworkManager.Validators/FirewallRuleNameValidator.cs new file mode 100644 index 0000000000..217687a6a3 --- /dev/null +++ b/Source/NETworkManager.Validators/FirewallRuleNameValidator.cs @@ -0,0 +1,50 @@ +using System.Globalization; +using System.Windows.Controls; +using System.Windows.Data; +using NETworkManager.Interfaces.ViewModels; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +/// +/// Provides validation logic for user-defined names or descriptions used in firewall rules. +/// Ensures the value meets specific criteria for validity: +/// - The character '|' is not allowed. +/// - The string length does not exceed 9999 characters. +/// +public class FirewallRuleNameValidator : ValidationRule +{ + /// + /// Validates a string based on the following two conditions: + /// - The string must not contain the '|' character. + /// - The string must not exceed a length of 9999 characters. + /// + /// The value to be validated. + /// The culture information used during validation. + /// A ValidationResult indicating whether the string is valid or not. + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + var bindingExpression = value as BindingExpression; + if (bindingExpression?.DataItem is not IFirewallRuleViewModel viewModel) + { + return new ValidationResult(false, + "No ViewModel could be found. Is the ValidationStep set correctly?"); + } + + if (string.IsNullOrEmpty(viewModel.UserDefinedName)) + { + viewModel.NameHasError = false; + return ValidationResult.ValidResult; + } + + if (viewModel.UserDefinedName.Length <= viewModel.MaxLengthName) + { + viewModel.NameHasError = false; + return ValidationResult.ValidResult; + } + + viewModel.NameHasError = true; + return new ValidationResult(false, Strings.InputLengthExceeded); + } + +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/FirewallRuleNoPipeValidator.cs b/Source/NETworkManager.Validators/FirewallRuleNoPipeValidator.cs new file mode 100644 index 0000000000..e5edccb5cf --- /dev/null +++ b/Source/NETworkManager.Validators/FirewallRuleNoPipeValidator.cs @@ -0,0 +1,38 @@ +using System.Globalization; +using System.Windows.Controls; +using System.Windows.Data; +using NETworkManager.Interfaces.ViewModels; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class FirewallRuleNoPipeValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + string valueToCheck; + bool isProfileValidation = false; + if (value is not BindingExpression bindingExpression) + { + valueToCheck = value?.ToString(); + } else if (bindingExpression.DataItem is not IProfileViewModel viewModel) + { + return new ValidationResult(false, + "No ViewModel could be found. Is the ValidationStep set correctly?"); + } + else + { + isProfileValidation = true; + if (!viewModel.Firewall_Enabled) + return ValidationResult.ValidResult; + valueToCheck = viewModel.Name; + } + if (string.IsNullOrWhiteSpace(valueToCheck)) + return ValidationResult.ValidResult; + return valueToCheck.Contains('|') + ? new ValidationResult(false, + isProfileValidation ? Strings.PipeNotAllowedWhenFirewallEnabled : Strings.PipeNotAllowed) + : ValidationResult.ValidResult; + + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Validators/NETworkManager.Validators.csproj b/Source/NETworkManager.Validators/NETworkManager.Validators.csproj index 2a0c1a9f7d..bc989c92c2 100644 --- a/Source/NETworkManager.Validators/NETworkManager.Validators.csproj +++ b/Source/NETworkManager.Validators/NETworkManager.Validators.csproj @@ -21,6 +21,7 @@ + diff --git a/Source/NETworkManager.Validators/ProgramNameLengthValidator.cs b/Source/NETworkManager.Validators/ProgramNameLengthValidator.cs new file mode 100644 index 0000000000..d52e61aeb8 --- /dev/null +++ b/Source/NETworkManager.Validators/ProgramNameLengthValidator.cs @@ -0,0 +1,16 @@ +using System.Globalization; +using System.Windows.Controls; +using NETworkManager.Localization.Resources; + +namespace NETworkManager.Validators; + +public class ProgramNameLengthValidator : ValidationRule +{ + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if (value is not string strVal) + return ValidationResult.ValidResult; + return strVal.Length > 259 ? new ValidationResult(false, Strings.ProgramNameTooLong) + : ValidationResult.ValidResult; + } +} \ No newline at end of file diff --git a/Source/NETworkManager.sln b/Source/NETworkManager.sln index bcfaeb362c..fef9fd0592 100644 --- a/Source/NETworkManager.sln +++ b/Source/NETworkManager.sln @@ -43,6 +43,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dragablz", "3rdparty\Dragab EndProject Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "NETworkManager.Setup", "NETworkManager.Setup\NETworkManager.Setup.wixproj", "{B474758D-E657-4DA6-AB2B-63764C5FBAF1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NETworkManager.Interfaces", "NETworkManager.Interfaces\NETworkManager.Interfaces.csproj", "{F25AA52C-7203-4F3D-B9B2-915DFFD25294}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -338,6 +340,26 @@ Global {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x64.Build.0 = Release|x64 {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x86.ActiveCfg = Release|x86 {B474758D-E657-4DA6-AB2B-63764C5FBAF1}.Release|x86.Build.0 = Release|x86 + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|ARM.ActiveCfg = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|ARM.Build.0 = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|ARM64.Build.0 = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|x64.ActiveCfg = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|x64.Build.0 = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|x86.ActiveCfg = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Debug|x86.Build.0 = Debug|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|Any CPU.Build.0 = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|ARM.ActiveCfg = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|ARM.Build.0 = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|ARM64.ActiveCfg = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|ARM64.Build.0 = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|x64.ActiveCfg = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|x64.Build.0 = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|x86.ActiveCfg = Release|Any CPU + {F25AA52C-7203-4F3D-B9B2-915DFFD25294}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Source/NETworkManager/Controls/FirewallRuleEnumTranslations.cs b/Source/NETworkManager/Controls/FirewallRuleEnumTranslations.cs new file mode 100644 index 0000000000..d2d0640e10 --- /dev/null +++ b/Source/NETworkManager/Controls/FirewallRuleEnumTranslations.cs @@ -0,0 +1,35 @@ +using NETworkManager.Models.Firewall; +using NETworkManager.ViewModels; + +namespace NETworkManager.Controls; + +/// +/// Static class to profile strings for Enum translations. +/// +public static class FirewallRuleEnumTranslation +{ + /// + /// Names of the firewall rule actions. + /// + public static string[] ActionNames => + FirewallRuleViewModel.GetEnumTranslation(typeof(FirewallRuleAction)); + + /// + /// Names of the directions. + /// + public static string[] DirectionNames => + FirewallRuleViewModel.GetEnumTranslation(typeof(FirewallRuleDirection)); + + /// + /// Names of the protocols. + /// + public static string[] ProtocolNames => + FirewallRuleViewModel.GetEnumTranslation(typeof(FirewallProtocol)); + + /// + /// Names of the interface types. + /// + public static string[] InterfaceTypeNames => + FirewallRuleViewModel.GetEnumTranslation(typeof(FirewallInterfaceType)); +} + diff --git a/Source/NETworkManager/Controls/FirewallRuleGrid.xaml b/Source/NETworkManager/Controls/FirewallRuleGrid.xaml new file mode 100644 index 0000000000..ba012ccfcd --- /dev/null +++ b/Source/NETworkManager/Controls/FirewallRuleGrid.xaml @@ -0,0 +1,679 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Controls/FirewallRuleGrid.xaml.cs b/Source/NETworkManager/Controls/FirewallRuleGrid.xaml.cs new file mode 100644 index 0000000000..ccd37c86fa --- /dev/null +++ b/Source/NETworkManager/Controls/FirewallRuleGrid.xaml.cs @@ -0,0 +1,393 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; +using System.Windows.Threading; +using NETworkManager.Converters; +using NETworkManager.Localization.Resources; +using NETworkManager.Models.Firewall; +using NETworkManager.ViewModels; + +namespace NETworkManager.Controls; + +/// +/// Code-behind for the firewall rule grid. +/// +public partial class FirewallRuleGrid +{ + /// + /// Mutex to prevent spamming the history for every rule. + /// + /// + /// Every rule's local and remote port combo boxes are registered to the + /// method. So, if one rule changes its + /// port values, every rule's combo boxes will trigger the event. Preventing this + /// with the following static variables. + /// + private static readonly Mutex LocalPortsAdding = new(); + /// + /// Last local port string, which was added. + /// + private static string _lastLocalPortsString = string.Empty; + /// + /// Mutex for remote ports being added to the history. + /// + private static readonly Mutex RemotePortsAdding = new(); + /// + /// Last remote port string, which was added. + /// + private static string _lastRemotePortsString = string.Empty; + + /// + /// List of TextBlock content to ignore on double clicks. + /// + private static readonly string[] IgnoredTextBlocks = [ Strings.Domain, Strings.Private, Strings.Public ]; + + public FirewallRuleGrid() + { + InitializeComponent(); + RestoreRuleGridFocus(); + } + + #region Events + /// + /// Handle new valid ports and add them to the history. + /// + /// The combo box. Not necessarily the one with the change. + /// Event arguments. Unused. + private void ComboBoxPorts_OnLostFocus(object sender, RoutedEventArgs e) + { + if (sender is not ComboBox comboBox) + return; + if (string.IsNullOrWhiteSpace(comboBox.Text)) + return; + if (Validation.GetHasError(comboBox)) + return; + var portType = (FirewallPortLocation)comboBox.Tag; + if (comboBox.DataContext is not FirewallRuleViewModel dataContext) + return; + var converter = new PortRangeToPortSpecificationConverter(); + var structuredData = converter.Convert(comboBox.Text, typeof(List), null, null); + if (structuredData is not List list) + return; + string formattedText = converter.ConvertBack(list, typeof(string), null, null) as string; + if (string.IsNullOrWhiteSpace(formattedText)) + return; + + // Direct visual update: Find the internal TextBox and force formatting the text. + // This bypasses ComboBox.Text property synchronization issues during LostFocus. + if (GetVisualChild(comboBox) is { } textBox) + { + // Only update if visually different to avoid cursor/selection side effects + if (textBox.Text != formattedText) + textBox.Text = formattedText; + } + switch (portType) + { + case FirewallPortLocation.LocalPorts: + if (_lastLocalPortsString == formattedText) + return; + + try + { + LocalPortsAdding?.WaitOne(); + _lastLocalPortsString = formattedText; + dataContext.AddPortsToHistory(formattedText, portType); + } + finally + { + LocalPortsAdding?.ReleaseMutex(); + } + break; + case FirewallPortLocation.RemotePorts: + if (_lastRemotePortsString == formattedText) + return; + + try + { + RemotePortsAdding?.WaitOne(); + _lastRemotePortsString = formattedText; + dataContext.AddPortsToHistory(formattedText, portType); + } + finally + { + RemotePortsAdding?.ReleaseMutex(); + } + break; + } + } + + /// + /// Toggle row visibility. + /// + /// + /// + private void ButtonBase_OnClick(object sender, RoutedEventArgs e) + { + if (e.OriginalSource is not Button) + return; + // Get the row from the sender + for (var visual = sender as Visual; visual != null; visual = VisualTreeHelper.GetParent(visual) as Visual) + { + if (visual is not DataGridRow row) + continue; + + + row.DetailsVisibility = + row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; + break; + } + } + + /// + /// Collapse and open rule details by double clicking. + /// + /// + /// + private void Row_OnDoubleClick(object sender, RoutedEventArgs e) + { + // Avoid collision with ButtonBase behavior + if (e.OriginalSource is Button or Rectangle) + return; + // Get the row from the sender + for (var visual = sender as Visual; visual != null; visual = VisualTreeHelper.GetParent(visual) as Visual) + { + if (visual is not DataGridRow row) + continue; + + if (row.DetailsVisibility is Visibility.Visible + && e.OriginalSource is not Border and not TextBlock and not CheckBox) + return; + if (e.OriginalSource is TextBlock textBlock && IgnoredTextBlocks.Contains(textBlock.DataContext as string)) + return; + row.DetailsVisibility = + row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; + break; + } + } + + + /// + /// Set the data context of the context menu. + /// + /// + /// + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = DataContext; + } + + /// + /// Keyboard control + /// + /// + /// + private void DataGridRow_PreviewKeyDown(object sender, KeyEventArgs e) + { + // Only handle if the focus is on the cell itself (navigation mode), + // to avoid interfering with editing (e.g., inside a TextBox). + if (e.OriginalSource is TextBox or CheckBox or ComboBox) + return; + + if (sender is not MultiSelectDataGrid grid) + return; + + if (DataContext is not FirewallViewModel dataContext) + return; + + DataGridRow row = null; + if (grid.SelectedIndex > -1 && e.OriginalSource is DependencyObject source) + row = ItemsControl.ContainerFromElement(grid, source) as DataGridRow; + + switch (e.Key) + { + case Key.A when Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl): + dataContext.ApplyConfigurationCommand.Execute(null); + e.Handled = true; + break; + case Key.D when Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl): + case Key.Delete: + int index = RuleGrid.SelectedIndex; + dataContext.DeleteRulesCommand.Execute(null); + if (grid.HasItems) + { + // Select the same index or the last item if we deleted the end + index = Math.Min(index, grid.Items.Count - 1); + if (index < 0) + index = 0; + grid.SelectedIndex = index; + grid.Focus(); + } + + e.Handled = true; + break; + case Key.C when (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) + && (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) + && (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)): + FirewallViewModel.DeleteWindowsRulesCommand.Execute(null); + e.Handled = true; + break; + case Key.C when (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) + && (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)): + dataContext.DeleteAllRulesCommand.Execute(null); + e.Handled = true; + break; + case Key.N when Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl): + dataContext.AddRuleCommand.Execute(null); + e.Handled = true; + break; + case Key.Right when row?.DetailsVisibility == Visibility.Collapsed: + row.DetailsVisibility = Visibility.Visible; + e.Handled = true; + break; + case Key.Left when row?.DetailsVisibility == Visibility.Visible: + row.DetailsVisibility = Visibility.Collapsed; + e.Handled = true; + break; + // If nothing is selected, start from the bottom or top row. + case Key.Down: + case Key.Up: + if (!grid.IsKeyboardFocused) + return; + if (row is null && grid.HasItems) + { + if (grid.SelectedIndex is -1) + index = e.Key is Key.Down ? 0 : grid.Items.Count - 1; + else + index = e.Key is Key.Down ? grid.SelectedIndex + 1 : grid.SelectedIndex - 1; + if (index < 0) + index = 0; + if (index >= grid.Items.Count) + index = grid.Items.Count - 1; + grid.SelectedIndex = index; + var item = grid.Items[grid.SelectedIndex] as FirewallRuleViewModel; + if (item is not null) + grid.ScrollIntoView(item); + grid.UpdateLayout(); + row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex) as DataGridRow; + var viewModel = grid.DataContext as FirewallViewModel; + viewModel?.SelectedRule = item; + } + FocusManager.SetFocusedElement(FocusManager.GetFocusScope(grid), null); + Keyboard.ClearFocus(); + // DataGridRow is not focusable. + if (row is not null) + { + var cell = GetCell(grid, row, 1); + cell?.Focus(); + } + e.Handled = true; + break; + case Key.W when Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl): + dataContext.OpenWindowsFirewallCommand.Execute(null); + e.Handled = true; + break; + } + } + + /// + /// Gets a DataGridCell from a given DataGrid, given row and column accounting for virtualization. + /// + /// The DataGrid to retrieve the cell from. + /// The row instance to get the index from. + /// The column index. + /// A DataGridCell instance. + private static DataGridCell GetCell(DataGrid grid, DataGridRow row, int column) + { + if (row == null) return null; + + var presenter = GetVisualChild(row); + if (presenter != null) + return presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell; + grid.ScrollIntoView(row, grid.Columns[column]); + presenter = GetVisualChild(row); + + return presenter?.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell; + } + + /// + /// Get the first child of a Visual, which is not null. + /// + /// Parent of children. + /// Any Visual type. + /// First non-null child found or null. + private static T GetVisualChild(Visual parent) where T : Visual + { + T child = null; + int numVisuals = VisualTreeHelper.GetChildrenCount(parent); + for (int i = 0; i < numVisuals; i++) + { + var v = (Visual)VisualTreeHelper.GetChild(parent, i); + child = v as T ?? GetVisualChild(v); + if (child != null) + { + break; + } + } + return child; + } + + /// + /// Restore the focus to the RuleGrid, whenever it is lost by column sorting or button clicks. + /// Also called on loading. + /// + public void RestoreRuleGridFocus() + { + if (RuleGrid is null) + return; + + // Post-focus: let WPF finish the click/command that caused focus to move away. + Dispatcher.BeginInvoke(new Action(() => + { + if (!IsVisible || !IsEnabled) + return; + + if (!RuleGrid.HasItems) + { + RuleGrid.Focus(); + return; + } + + if (RuleGrid.SelectedIndex < 0) + RuleGrid.SelectedIndex = 0; + + RuleGrid.ScrollIntoView(RuleGrid.SelectedItem); + RuleGrid.UpdateLayout(); + + // Prefer focusing a real cell (more reliable than focusing the DataGrid itself). + var row = RuleGrid.ItemContainerGenerator.ContainerFromIndex(RuleGrid.SelectedIndex) as DataGridRow; + if (row != null) + { + // Pick a sensible column (0 = expander button column; 1 = "Name" in your grid). + var cell = GetCell(RuleGrid, row, column: 1) ?? GetCell(RuleGrid, row, column: 0); + if (cell != null) + { + cell.Focus(); + Keyboard.Focus(cell); + return; + } + } + + RuleGrid.Focus(); + Keyboard.Focus(RuleGrid); + }), DispatcherPriority.Input); + } + + /// + /// Delegate the refocusing to on sorting, + /// but with another dispatcher context. + /// + /// + /// + private void RuleGrid_OnSorting(object sender, DataGridSortingEventArgs e) + { + Dispatcher.BeginInvoke(new Action(RestoreRuleGridFocus), DispatcherPriority.ContextIdle); + } + #endregion + +} \ No newline at end of file diff --git a/Source/NETworkManager/MainWindow.xaml.cs b/Source/NETworkManager/MainWindow.xaml.cs index 3ae9740f5e..2ae5dd25b4 100644 --- a/Source/NETworkManager/MainWindow.xaml.cs +++ b/Source/NETworkManager/MainWindow.xaml.cs @@ -697,6 +697,7 @@ private void LoadApplicationList() private ConnectionsView _connectionsView; private ListenersView _listenersView; private ARPTableView _arpTableView; + private FirewallView _firewallView; /// @@ -917,6 +918,14 @@ private void OnApplicationViewVisible(ApplicationName name, bool fromSettings = ContentControlApplication.Content = _arpTableView; break; + case ApplicationName.Firewall: + if (_firewallView is null) + _firewallView = new FirewallView(); + else + _firewallView.OnViewVisible(); + + ContentControlApplication.Content = _firewallView; + break; default: Log.Error("Cannot show unknown application view: " + name); @@ -1006,6 +1015,10 @@ private void OnApplicationViewHide(ApplicationName name) case ApplicationName.ARPTable: _arpTableView?.OnViewHide(); break; + case ApplicationName.Firewall: + _firewallView?.OnViewHide(); + break; + default: Log.Error("Cannot hide unknown application view: " + name); break; @@ -1116,6 +1129,8 @@ await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Erro break; case ApplicationName.ARPTable: break; + case ApplicationName.Firewall: + break; case ApplicationName.None: default: Log.Error($"Cannot redirect data to unknown application: {data.Application}"); @@ -1467,7 +1482,12 @@ await DialogHelper.ShowMessageAsync(Application.Current.MainWindow, Strings.Prof private void OnProfilesLoaded(ApplicationName name) { - + switch (name) + { + case ApplicationName.Firewall: + (_firewallView?.DataContext as FirewallViewModel)?.OnProfilesLoaded(); + break; + } } /// diff --git a/Source/NETworkManager/NETworkManager.csproj b/Source/NETworkManager/NETworkManager.csproj index 6a6a3a04a2..3e397afbf6 100644 --- a/Source/NETworkManager/NETworkManager.csproj +++ b/Source/NETworkManager/NETworkManager.csproj @@ -82,6 +82,9 @@ $(TargetDir)\lib\MSTSCLib.dll + + FirewallRuleGrid.xaml + @@ -92,6 +95,7 @@ + @@ -141,6 +145,11 @@ Wpf Designer + + MSBuild:Compile + Wpf + Designer + diff --git a/Source/NETworkManager/ProfileDialogManager.cs b/Source/NETworkManager/ProfileDialogManager.cs index 5f6d9c83f9..841ce33519 100644 --- a/Source/NETworkManager/ProfileDialogManager.cs +++ b/Source/NETworkManager/ProfileDialogManager.cs @@ -269,7 +269,11 @@ private static ProfileInfo ParseProfileInfo(ProfileViewModel instance) IPGeolocation_InheritHost = instance.IPGeolocation_InheritHost, IPGeolocation_Host = instance.IPGeolocation_InheritHost ? instance.Host?.Trim() - : instance.IPGeolocation_Host?.Trim() + : instance.IPGeolocation_Host?.Trim(), + + // Firewall + Firewall_Enabled = instance.Firewall_Enabled, + Firewall_Rules = instance.GetFirewallRules() }; } diff --git a/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs b/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs new file mode 100644 index 0000000000..460dda7b0b --- /dev/null +++ b/Source/NETworkManager/ViewModels/FirewallRuleViewModel.cs @@ -0,0 +1,1049 @@ +using System.IO; + +namespace NETworkManager.ViewModels; + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Windows.Data; +using System.Windows.Forms; +using System.Windows.Input; +using Localization.Resources; +using Models.Firewall; +using NW = Models.Network; +using NETworkManager.Interfaces.ViewModels; +using Settings; +using Utilities; + +/// +/// ViewModel for a firewall rule +/// +public class FirewallRuleViewModel : ViewModelBase, ICloneable, IFirewallRuleViewModel +{ + #region Variables + + /// + /// Reflected access to converter. + /// + private static IValueConverter PortRangeToPortSpecificationConverter + { + get + { + if (field is not null) return field; + var type = Type.GetType( + "NETworkManager.Converters.PortRangeToPortSpecificationConverter, NETworkManager.Converters"); + + if (type is null) return field; + var ctor = Expression.New(type); + var lambda = Expression.Lambda>(ctor); + field = lambda.Compile().Invoke(); + + return field; + } + } + + /// + /// Represents the underlying firewall rule associated with the configuration. + /// + [NotNull] + private readonly FirewallRule _rule = new(); + + public bool NameHasError + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasError)); + } + } + + public bool DescriptionHasError + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasError)); + } + } + + public bool ProgramHasError + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasError)); + } + } + + private bool ProfilesHaveError + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasError)); + } + } + + public bool HasError => NameHasError || DescriptionHasError || ProgramHasError || ProfilesHaveError; + + /// + /// Represents the name or identifier associated with an entity or object. + /// + public string Name + { + get => _rule.Name; + set + { + if (value == _rule.Name) + return; + _rule.Name = value; + ValidateName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + /// + /// Optionally describe the firewall rule with this property + /// + public string Description + { + get => _rule.Description; + set + { + if (value == _rule.Description) + return; + _rule.Description = value; + OnRuleChangedEvent(); + OnPropertyChanged(); + } + } + + /// + /// Name of the currently loaded profile + /// + public string ProfileName + { + get; + set + { + if (value == field) + return; + field = value; + UpdateRuleName(); + OnPropertyChanged(); + OnPropertyChanged(nameof(MaxLengthName)); + OnPropertyChanged(nameof(UserDefinedName)); + OnRuleChangedEvent(); + } + } + + private string _userDefineName; + /// + /// Name override for the firewall DisplayName + /// + public string UserDefinedName + { + get; + set + { + if (value == field) + return; + field = value; + if (value?.Length <= MaxLengthName) + _userDefineName = value; + ValidateName(); + OnPropertyChanged(); + UpdateRuleName(); + OnRuleChangedEvent(); + } + } + + /// + /// Max length of the firewall DisplayName + /// + public int MaxLengthName => + 9999 - "NwM__".Length - ProfileName?.Length ?? + 9999 - "NwM__".Length - "Default".Length; + + /// + /// Default name shown in the field watermark and used, if no is provided. + /// + public string DefaultName + { + get; + private set + { + if (field == value) + return; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Firewall protocol to apply the rule to. + /// + public FirewallProtocol Protocol + { + get => _rule.Protocol; + set + { + if (value == _rule.Protocol) + return; + _rule.Protocol = value; + UpdateRuleName(); + OnPropertyChanged(); + OnPropertyChanged(nameof(PortsEnabled)); + OnRuleChangedEvent(); + } + } + + /// + /// Specifies the direction of traffic flow for the rule. + /// + public FirewallRuleDirection Direction + { + get => _rule.Direction; + set + { + if (value == _rule.Direction) + return; + _rule.Direction = value; + UpdateRuleName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + /// + /// Program for which the rule applies. + /// + public FirewallRuleProgram Program + { + get => _rule.Program; + set + { + if (value == _rule.Program) + return; + _rule.Program = value; + ValidateProgramPath(); + UpdateRuleName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + /// + /// Binding field for the port input fields to be activated. + /// + public bool PortsEnabled => Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP; + + /// + /// Specifies the local ports that the rule applies to. + /// + public List LocalPorts + { + get => _rule.LocalPorts; + set + { + _rule.LocalPorts = value; + UpdateRuleName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + /// + /// Index of the history combobox. + /// + public int LocalPortsIndex + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } = -1; + + /// + /// Specifies the remote ports that the rule applies to. + /// + public List RemotePorts + { + get => _rule.RemotePorts; + set + { + _rule.RemotePorts = value; + UpdateRuleName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + /// + /// Index of the history combobox. + /// + public int RemotePortsIndex + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } = -1; + + /// + /// View for history combobox. + /// + public ICollectionView LocalPortsHistoryView { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + + } + + /// + /// View for history combobox. + /// + public ICollectionView RemotePortsHistoryView + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Local port history. + /// + public static ObservableCollection LocalPortsHistory + { + get; + set; + } = []; + + /// + /// Remote port history. + /// + public static ObservableCollection RemotePortsHistory + { + get; + set; + } = []; + + /// + /// View for the combination of and history. + /// + public static ObservableCollection CombinedPortsHistory + { + get; + } = []; + + private string _lastLocalPortValue = string.Empty; + private string _lastRemotePortValue = string.Empty; + private readonly bool _isInit; + + /// + /// Watermark for the port input fields. + /// + public string PortWatermark + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Checkbox for the domain network profile. + /// + public bool NetworkProfileDomain + { + get; + set + { + if (value == field) + return; + field = value; + if (_isInit) + return; + // Temporarily apply the change to a copy to check validity + var newProfiles = _rule.NetworkProfiles.ToArray(); + newProfiles[(int)NW.NetworkProfiles.Domain] = value; + + if (newProfiles.Any(x => x)) + { + NetworkProfiles[(int)NW.NetworkProfiles.Domain] = value; + NetworkProfiles[(int)NW.NetworkProfiles.Private] = NetworkProfilePrivate; + NetworkProfiles[(int)NW.NetworkProfiles.Public] = NetworkProfilePublic; + ProfilesHaveError = false; + UpdateRuleName(); + OnRuleChangedEvent(); + } + else + { + ProfilesHaveError = true; + } + OnPropertyChanged(); + OnPropertyChanged(nameof(NetworkProfilePrivate)); + OnPropertyChanged(nameof(NetworkProfilePublic)); + OnPropertyChanged(nameof(NetworkProfiles)); + } + } + + /// + /// Checkbox for the private network profile. + /// + public bool NetworkProfilePrivate + { + get; + set + { + if (value == field) + return; + field = value; + if (_isInit) + return; + var newProfiles = _rule.NetworkProfiles.ToArray(); + newProfiles[(int)NW.NetworkProfiles.Private] = value; + + if (newProfiles.Any(x => x)) + { + NetworkProfiles[(int)NW.NetworkProfiles.Domain] = NetworkProfileDomain; + NetworkProfiles[(int)NW.NetworkProfiles.Private] = value; + NetworkProfiles[(int)NW.NetworkProfiles.Public] = NetworkProfilePublic; + ProfilesHaveError = false; + UpdateRuleName(); + OnRuleChangedEvent(); + } + else + { + ProfilesHaveError = true; + } + + OnPropertyChanged(); + OnPropertyChanged(nameof(NetworkProfileDomain)); + OnPropertyChanged(nameof(NetworkProfilePublic)); + OnPropertyChanged(nameof(NetworkProfiles)); + } + } + + /// + /// Checkbox for the public network profile. + /// + public bool NetworkProfilePublic + { + get; + set + { + if (value == field) + return; + field = value; + if (_isInit) + return; + var newProfiles = _rule.NetworkProfiles.ToArray(); + newProfiles[(int)NW.NetworkProfiles.Public] = value; + + if (newProfiles.Any(x => x)) + { + NetworkProfiles[(int)NW.NetworkProfiles.Domain] = NetworkProfileDomain; + NetworkProfiles[(int)NW.NetworkProfiles.Private] = NetworkProfilePrivate; + NetworkProfiles[(int)NW.NetworkProfiles.Public] = value; + ProfilesHaveError = false; + UpdateRuleName(); + OnRuleChangedEvent(); + } + else + { + ProfilesHaveError = true; + } + OnPropertyChanged(); + OnPropertyChanged(nameof(NetworkProfileDomain)); + OnPropertyChanged(nameof(NetworkProfilePrivate)); + OnPropertyChanged(nameof(NetworkProfiles)); + } + } + + /// + /// Combination of all checkboxes for network profiles. + /// + public bool[] NetworkProfiles + { + get => _rule.NetworkProfiles; + init + { + if (value == _rule.NetworkProfiles) + return; + _isInit = true; + _rule.NetworkProfiles = value; + NetworkProfileDomain = value[(int)NW.NetworkProfiles.Domain]; + NetworkProfilePrivate = value[(int)NW.NetworkProfiles.Private]; + NetworkProfilePublic = value[(int)NW.NetworkProfiles.Public]; + _isInit = false; + OnPropertyChanged(); + OnPropertyChanged(nameof(NetworkProfileDomain)); + OnPropertyChanged(nameof(NetworkProfilePrivate)); + OnPropertyChanged(nameof(NetworkProfilePublic)); + OnRuleChangedEvent(); + } + } + + /// + /// Interface type filter for the firewall rule. + /// + public FirewallInterfaceType InterfaceType + { + get => _rule.InterfaceType; + set + { + if (value == _rule.InterfaceType) + return; + _rule.InterfaceType = value; + OnPropertyChanged(); + UpdateRuleName(); + OnRuleChangedEvent(); + } + } + + /// + /// Action to execute when the rule is applied. + /// + public FirewallRuleAction Action + { + get => _rule.Action; + set + { + if (value == _rule.Action) + return; + _rule.Action = value; + UpdateRuleName(); + OnPropertyChanged(); + OnRuleChangedEvent(); + } + } + + public int MaxLengthHistory + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + #endregion + + #region Constructor + + /// + /// Represents a view model for a firewall rule that provides details + /// about the rule's configuration and state for user interface bindings. + /// + public FirewallRuleViewModel() + { + NetworkProfiles = [true, true, true]; + ProfileName = "Default"; + PortWatermark = StaticStrings.ExamplePortScanRange; + if (SettingsManager.Current.Firewall_UseWindowsPortSyntax) + PortWatermark = PortWatermark.Replace(";", ","); + + // Set the collection views for port histories + if (SettingsManager.Current.Firewall_CombinePortHistory) + { + LocalPortsHistoryView = CollectionViewSource.GetDefaultView(CombinedPortsHistory); + RemotePortsHistoryView = CollectionViewSource.GetDefaultView(CombinedPortsHistory); + } + else + { + LocalPortsHistoryView = CollectionViewSource. + GetDefaultView(LocalPortsHistory); + RemotePortsHistoryView = CollectionViewSource. + GetDefaultView(RemotePortsHistory); + } + } + + /// + /// Construct a rule from a Firewall rule and a profile name. + /// + /// The rule to get data from. + /// The profile name to use. + public FirewallRuleViewModel(FirewallRule rule, string profileName = null) : this() + { + Direction = rule.Direction; + Protocol = rule.Protocol; + LocalPorts = rule.LocalPorts; + RemotePorts = rule.RemotePorts; + if (SettingsManager.Current.Firewall_CombinePortHistory) + { + char separator = SettingsManager.Current.Firewall_UseWindowsPortSyntax ? ',' : ';'; + LocalPortsIndex = CombinedPortsHistory.IndexOf(FirewallRule.PortsToString(LocalPorts, separator)); + RemotePortsIndex = CombinedPortsHistory.IndexOf(FirewallRule.PortsToString(RemotePorts, separator)); + } + Program = rule.Program; + Description = rule.Description; + Action = rule.Action; + InterfaceType = rule.InterfaceType; + NetworkProfiles = rule.NetworkProfiles; + ProfileName = profileName; + UpdateRuleName(); + string ruleName = rule.Name.Substring("NwM_".Length); + ruleName = ruleName.Substring(0, ruleName.LastIndexOf('_')); + if (DefaultName != ruleName) + UserDefinedName = ruleName; + } + #endregion + + #region Methods + /// + /// Updates the firewall rule's name based on the current configuration. + /// + private void UpdateRuleName() + { + StringBuilder resultBuilder = new(); + if (!string.IsNullOrWhiteSpace(_userDefineName)) + { + resultBuilder.Append(_userDefineName); + } + else + { + string nextToken; + var direction = Direction switch + { + FirewallRuleDirection.Inbound => "in", + FirewallRuleDirection.Outbound => "out", + _ => null + }; + if (direction is not null) + resultBuilder.Append(direction); + resultBuilder.Append($"_{Protocol}"); + if (Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP) + { + if (LocalPorts?.Count is 0 && RemotePorts?.Count is 0) + { + resultBuilder.Append("_any"); + } + else + { + char separator = SettingsManager.Current.Firewall_UseWindowsPortSyntax ? ',' : ';'; + if (LocalPorts?.Count > 0) + { + nextToken = $"_loc:{FirewallRule.PortsToString(LocalPorts, separator, false)}"; + if (nextToken.Length > 20) + nextToken = $"{nextToken[..20]}..."; + resultBuilder.Append(nextToken); + } + + if (RemotePorts?.Count > 0) + { + nextToken = $"_rem:{FirewallRule.PortsToString(RemotePorts, separator, false)}"; + if (nextToken.Length > 20) + nextToken = $"{nextToken[..20]}..."; + resultBuilder.Append(nextToken); + } + } + } + + if (!string.IsNullOrEmpty(Program?.Executable?.Name)) + { + nextToken = $"_{Program.Executable.Name}"; + if (nextToken.Length > 30) + nextToken = $"{nextToken[..30]}..."; + resultBuilder.Append(nextToken); + } + + if (NetworkProfiles.Any(x => x)) + { + resultBuilder.Append('_'); + if (NetworkProfiles.All(x => x)) + { + resultBuilder.Append("all"); + } + else + { + if (NetworkProfiles[(int)NW.NetworkProfiles.Domain]) + resultBuilder.Append("dom,"); + if (NetworkProfiles[(int)NW.NetworkProfiles.Private]) + resultBuilder.Append("prv,"); + if (NetworkProfiles[(int)NW.NetworkProfiles.Public]) + resultBuilder.Append("pub"); + if (resultBuilder[^1] == ',') + resultBuilder.Remove(resultBuilder.Length - 1, 1); + } + } + string type = InterfaceType switch + { + FirewallInterfaceType.RemoteAccess => "vpn", + FirewallInterfaceType.Wired => "wire", + FirewallInterfaceType.Wireless => "wifi", + _ => null + }; + if (type is not null) + resultBuilder.Append($"_if:{type}"); + string action = Action switch + { + FirewallRuleAction.Allow => "acc", + FirewallRuleAction.Block => "blk", + _ => null + }; + if (action is not null) + resultBuilder.Append($"_{action}"); + } + + string defaultName = resultBuilder.ToString(); + if (defaultName.Length > MaxLengthName) + defaultName = $"{defaultName[..(MaxLengthName - 3)]}..."; + Name = $"NwM_{defaultName}_{ProfileName ?? "Default"}"; + DefaultName = defaultName; + } + + /// + /// Sets the error state while the view is not in the VisualTree, which can happen + /// in the ProfileChildWindow until the tab has been opened. + /// + private void ValidateName() + { + if (string.IsNullOrEmpty(UserDefinedName) || UserDefinedName.Length <= MaxLengthName) + { + NameHasError = false; + return; + } + + NameHasError = true; + } + + private void ValidateProgramPath() + { + if (Program?.Executable?.FullName is not { } strValue) + { + ProgramHasError = false; + return; + } + ProgramHasError = !File.Exists(strValue); + } + + /// Converts the current instance of the FirewallRuleViewModel to a FirewallRule object. + /// + /// A object representing the current instance. + /// + public FirewallRule ToRule(bool toLoadOrSave = false) + { + ValidateProgramPath(); + ValidateName(); + return HasError && !toLoadOrSave ? null : _rule; + } + + /// + /// Retrieves the localized translation for a given enumeration value. + /// + /// The enumeration type to translate. + /// The localized string corresponding to the provided enumeration value. + public static string[] GetEnumTranslation(Type enumType) + { + if (!enumType.IsEnum) + return null; + + var enumStrings = Enum.GetNames(enumType); + var transStrings = new string[enumStrings.Length]; + for (int i = 0; i < enumStrings.Length; i++) + transStrings[i] = Strings.ResourceManager.GetString(enumStrings[i], Strings.Culture) ?? enumStrings[i]; + + return transStrings; + } + + /// + /// Store the current port values to spare them from deletion on collection clearing. + /// + public void StorePortValues() + { + // Store original port values + var converter = PortRangeToPortSpecificationConverter; + _lastLocalPortValue = converter.ConvertBack(LocalPorts, typeof(string), null, null) as string; + _lastRemotePortValue = converter.ConvertBack(RemotePorts, typeof(string), null, null) as string; + } + + /// + /// Restore the port values after the history has been modified. + /// + public void RestorePortValues() + { + var converter = PortRangeToPortSpecificationConverter; + // Restore the original field values + if (!string.IsNullOrWhiteSpace(_lastLocalPortValue)) + { + // Find appropriate index + int tmpLocalIndex = SettingsManager.Current.Firewall_CombinePortHistory ? + CombinedPortsHistory.IndexOf(_lastLocalPortValue) : LocalPortsHistory.IndexOf(_lastLocalPortValue); + // Restore field value + if (tmpLocalIndex != -1 + && converter.Convert(_lastLocalPortValue, typeof(List), + null, null) is List convertedPorts) + LocalPorts = convertedPorts; + LocalPortsIndex = tmpLocalIndex; + + + } + // Reset stored value + _lastLocalPortValue = string.Empty; + + // Same for remote ports + if (!string.IsNullOrWhiteSpace(_lastRemotePortValue)) + { + int tmpRemoteIndex = SettingsManager.Current.Firewall_CombinePortHistory ? + CombinedPortsHistory.IndexOf(_lastRemotePortValue) : RemotePortsHistory.IndexOf(_lastRemotePortValue); + if (tmpRemoteIndex != -1 + && converter.Convert(_lastRemotePortValue, typeof(List), + null, null) is List convertedPorts) + RemotePorts = convertedPorts; + RemotePortsIndex = tmpRemoteIndex; + } + // Reset stored value + _lastRemotePortValue = string.Empty; + } + + /// + /// Add ports to history. + /// + /// Port list to add. + /// Type of port history to add to. + public void AddPortsToHistory(string ports, FirewallPortLocation firewallPortType) + { + OnAddingPortsToHistoryEvent(); + ObservableCollection portHistory; + switch (firewallPortType) + { + case FirewallPortLocation.LocalPorts: + portHistory = LocalPortsHistory; + break; + case FirewallPortLocation.RemotePorts: + portHistory = RemotePortsHistory; + break; + default: + return; + } + + // Create the new list + var list = ListHelper.Modify(portHistory.ToList(), ports, + SettingsManager.Current.General_HistoryListEntries); + + // Clear the old items + portHistory.Clear(); + + // Raise property changed again after the collection has been cleared + switch (firewallPortType) + { + case FirewallPortLocation.LocalPorts: + OnPropertyChanged(nameof(LocalPortsHistoryView)); + break; + case FirewallPortLocation.RemotePorts: + OnPropertyChanged(nameof(RemotePortsHistoryView)); + break; + } + + // Fill with the new items + list.ForEach(x => portHistory.Add(x)); + + // Update history config + switch (firewallPortType) + { + case FirewallPortLocation.LocalPorts: + LocalPortsHistory = portHistory; + SettingsManager.Current.Firewall_LocalPortsHistoryConfig = list; + FirewallSettingsViewModel.Instance.LocalPortsHaveItems = true; + break; + case FirewallPortLocation.RemotePorts: + RemotePortsHistory = portHistory; + SettingsManager.Current.Firewall_RemotePortsHistoryConfig = list; + FirewallSettingsViewModel.Instance.RemotePortsHaveItems = true; + break; + } + + // Update the combined history if configured + if (SettingsManager.Current.Firewall_CombinePortHistory) + UpdateCombinedPortsHistory(); + OnAddedPortsToHistoryEvent(); + } + + /// + /// Update or create the combined port history. + /// + public static void UpdateCombinedPortsHistory() + { + if (!SettingsManager.Current.Firewall_CombinePortHistory) + return; + + // This will as a side effect reset all unchanged combobox fields in all rules, because its source is empty + // StorePorts() and RestorePorts() are required to circumvent this. + CombinedPortsHistory.Clear(); + + // Refill the combined history alternating between local and remote fields when possible + int count = 0; + int indexLocal = 0; + int indexRemote = 0; + bool swap = false; + var localPorts = LocalPortsHistory; + var remotePorts = RemotePortsHistory; + if (localPorts is null | remotePorts is null) + return; + while (count < SettingsManager.Current.General_HistoryListEntries) + { + if (indexLocal >= localPorts.Count + && indexRemote >= remotePorts.Count) + break; + if (indexLocal < localPorts.Count && (!swap || indexRemote >= remotePorts.Count)) + { + // Avoid duplicates + if (CombinedPortsHistory.Contains(localPorts[indexLocal++])) + continue; + CombinedPortsHistory.Add(localPorts[indexLocal - 1]); + swap = true; + count++; + continue; + } + if (indexRemote < remotePorts.Count) + { + if (CombinedPortsHistory.Contains(remotePorts[indexRemote++])) + continue; + CombinedPortsHistory.Add(remotePorts[indexRemote - 1]); + count++; + swap = false; + } + } + } + + /// + /// Command for selecting a program. + /// + public ICommand SelectProgramCommand => new RelayCommand(_ => SelectProgramAction()); + + /// + /// Select the program using a file dialog. + /// + private void SelectProgramAction() + { + var openFileDialog = new OpenFileDialog(); + + var fileExtension = "exe"; + + openFileDialog.Filter = $@"{Strings.Program} | *.{fileExtension}"; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + Program = new FirewallRuleProgram(openFileDialog.FileName); + } + + /// + /// Clone this instance. + /// + /// Cloned instance. + public object Clone() + { + var clone = new FirewallRuleViewModel + { + Name = new string(Name ?? string.Empty), + Program = Program?.Clone() as FirewallRuleProgram, + NetworkProfileDomain = NetworkProfileDomain, + NetworkProfilePrivate = NetworkProfilePrivate, + NetworkProfilePublic = NetworkProfilePublic, + DefaultName = new string(DefaultName ?? string.Empty), + Action = Action, + InterfaceType = InterfaceType, + Protocol = Protocol, + Direction = Direction, + LocalPorts = LocalPorts?.ToList(), + RemotePorts = RemotePorts?.ToList(), + NetworkProfiles = NetworkProfiles.ToArray(), + PortWatermark = new string(PortWatermark ?? string.Empty), + Description = new string(Description ?? string.Empty), + UserDefinedName = new string(UserDefinedName ?? string.Empty), + LocalPortsIndex = LocalPortsIndex, + RemotePortsIndex = RemotePortsIndex, + }; + UpdateCombinedPortsHistory(); + return clone; + } + #endregion + + #region Events + + /// + /// Event when ports are added to history. + /// + public event EventHandler OnAddingPortsToHistory; + + /// + /// Fire event. + /// + private void OnAddingPortsToHistoryEvent() + { + OnAddingPortsToHistory?.Invoke(this, EventArgs.Empty); + } + + /// + /// Event after ports have been added to history. + /// + public event EventHandler OnAddedPortsToHistory; + + /// + /// Fire event. + /// + private void OnAddedPortsToHistoryEvent() + { + OnAddedPortsToHistory?.Invoke(this, EventArgs.Empty); + } + + /// + /// Event when the rule configuration has changed. + /// + public event EventHandler OnRuleChanged; + + /// + /// Fire event. + /// + private void OnRuleChangedEvent() + { + OnRuleChanged?.Invoke(this, EventArgs.Empty); + } + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/FirewallSettingsViewModel.cs b/Source/NETworkManager/ViewModels/FirewallSettingsViewModel.cs new file mode 100644 index 0000000000..c313c38133 --- /dev/null +++ b/Source/NETworkManager/ViewModels/FirewallSettingsViewModel.cs @@ -0,0 +1,162 @@ +using System; +using System.Windows.Input; +using NETworkManager.Settings; +using NETworkManager.Utilities; + +namespace NETworkManager.ViewModels; + +public class FirewallSettingsViewModel : ViewModelBase +{ + private static readonly Lazy Lazy = new(() => new FirewallSettingsViewModel()); + + public static FirewallSettingsViewModel Instance => Lazy.Value; + + #region Variables + /// + /// The view model is loading initial settings. + /// + private readonly bool _isLoading; + + /// + /// Setting for combining the port history of local and remote ports. + /// + public bool CombinePortHistory + { + get; + set + { + if (value == field) + return; + if (!_isLoading) + SettingsManager.Current.Firewall_CombinePortHistory = value; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Setting to use the port separator comma instead of semicolon like it is used in WF.msc. + /// + /// + /// The PortScanner application uses semicolon. + /// + public bool UseWindowsPortSyntax + { + get; + set + { + if (value == field) + return; + if (!_isLoading) + SettingsManager.Current.Firewall_UseWindowsPortSyntax = value; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Whether the remote ports history has entries. + /// + public bool RemotePortsHaveItems + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Whether the local ports history has entries. + /// + public bool LocalPortsHaveItems + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + /// + /// Configurable length of history entries. + /// + public int MaxLengthHistory + { + get; + set + { + if (value == field) + return; + field = value; + SettingsManager.Current.Firewall_MaxLengthHistory = value; + OnPropertyChanged(); + } + } + #endregion + + #region Constructor, load settings + /// + /// Construct the view model and load settings. + /// + private FirewallSettingsViewModel() + { + _isLoading = true; + + LoadSettings(); + _isLoading = false; + } + + /// + /// Load the settings via . + /// + private void LoadSettings() + { + CombinePortHistory = SettingsManager.Current.Firewall_CombinePortHistory; + UseWindowsPortSyntax = SettingsManager.Current.Firewall_UseWindowsPortSyntax; + LocalPortsHaveItems = SettingsManager.Current.Firewall_LocalPortsHistoryConfig?.Count > 0; + RemotePortsHaveItems = SettingsManager.Current.Firewall_RemotePortsHistoryConfig?.Count > 0; + MaxLengthHistory = SettingsManager.Current.Firewall_MaxLengthHistory; + if (MaxLengthHistory is 0) + MaxLengthHistory = -1; + } + #endregion + + #region Commands + /// + /// Command for . + /// + public ICommand ClearLocalPortHistoryCommand => new RelayCommand(_ => ClearLocalPortHistoryAction()); + + /// + /// Action for clearing the LocalPort history. />. + /// + private void ClearLocalPortHistoryAction() + { + SettingsManager.Current.Firewall_LocalPortsHistoryConfig.Clear(); + LocalPortsHaveItems = false; + } + + /// + /// Command for . + /// + public ICommand ClearRemotePortHistoryCommand => new RelayCommand(_ => ClearRemotePortHistoryAction()); + + /// + /// Action for clearing the LocalPort history. />. + /// + private void ClearRemotePortHistoryAction() + { + SettingsManager.Current.Firewall_RemotePortsHistoryConfig.Clear(); + RemotePortsHaveItems = false; + } + + #endregion +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/FirewallViewModel.cs b/Source/NETworkManager/ViewModels/FirewallViewModel.cs new file mode 100644 index 0000000000..7d1bbadb97 --- /dev/null +++ b/Source/NETworkManager/ViewModels/FirewallViewModel.cs @@ -0,0 +1,1325 @@ +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace NETworkManager.ViewModels; + +using NETworkManager.Interfaces.ViewModels; +using System.Windows; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Windows.Threading; +using MahApps.Metro.Controls; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System; +using System.Linq; +using System.Windows.Input; +using Controls; +using Profiles; +using Models; +using Settings; +using Models.Firewall; +using Utilities; +using Localization.Resources; + +/// +/// ViewModel for the Firewall application. +/// +public class FirewallViewModel : ViewModelBase, IProfileManager, ICloneable, IFirewallViewModel +{ + #region Variables + + public static IFirewallViewModel Instance + { + get + { + if (field is not null) + return field; + field = new FirewallViewModel(); + IFirewallViewModel.SetInstance(field); + return field; + } + } + + /// + /// Dispatcher timer for profile searches. + /// + private readonly DispatcherTimer _searchDispatcherTimer = new(); + + /// + /// Search unavailable. + /// + private bool _searchDisabled; + + /// + /// Base Constructor is running. + /// + private readonly bool _isLoading; + + /// + /// Settings are loaded. + /// + private bool _loadingSettings; + + /// + /// View is active. + /// + public bool IsViewActive { get; private set; } = true; + + /// + /// The last value of the UseWindowsPortSyntax setting. + /// + private bool _lastUseWindowsPortSyntax; + + /// + /// This model has been cloned. + /// + public bool IsClone { get; } + + /// + /// Firewall rule currently being selected. + /// + public FirewallRuleViewModel SelectedRule + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Firewall rule config being saved on application exit. + /// + private List FirewallRulesConfig + { + set + { + if (value == field) + return; + field = value; + if ((!_isLoading || _loadingSettings) && (Profiles?.IsEmpty ?? true) && !IsClone) + SettingsManager.Current.Firewall_FirewallRules = value; + } + } + + public ObservableCollection FirewallRulesInterface => new(FirewallRules); + + /// + /// Firewall rules being displayed in the UI. + /// + public ObservableCollection FirewallRules + { + get; + set + { + if (Equals(value, field)) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(FirewallRulesInterface)); + } + } + + /// + /// Currently selected rules, if more than one is selected. + /// + public IList SelectedRules + { + get; + set + { + if (value.Equals(field)) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicate whether settings are applied. + /// + private bool IsConfigurationRunning + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public int MaxLengthHistory + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + public string ToolTipAdd => $"{Strings.Firewall_ToolTip_Add}: {Strings.Ctrl}+N"; + + public string ToolTipDelete => $"{Strings.Firewall_ToolTip_Delete}: {Strings.Ctrl}+D; {Strings.Del}"; + + public string ToolTipClear => $"{Strings.Firewall_ToolTip_Clear}: {Strings.Ctrl}+{Strings.Shift}+C"; + + public string ToolTipApply => $"{Strings.Firewall_ToolTip_Apply}: {Strings.Ctrl}+A"; + + public string ToolTipOpenWindowsFirewall => $"{Strings.Firewall_ToolTip_OpenWindowsFirewall}: {Strings.Ctrl}+W"; + + public string ToolTipClearWindows => $"{Strings.Firewall_ToolTip_ClearWindows}: {Strings.Ctrl}+{Strings.Shift}+{Strings.Alt}+C"; + #region Profiles + + /// + /// Collection of user or system profiles associated with the current instance, + /// providing access to profile-specific data and configurations. + /// + public ICollectionView Profiles + { + get; + private set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + public string ProfileName + { + get; + set + { + if (value == field) + return; + if (value != null) + { + if (SelectedProfile is null) + { + foreach (var rule in FirewallRules) + { + rule.ProfileName = value; + rule.OnRuleChanged += OnRulesChanged; + rule.OnAddingPortsToHistory += OnAddingPortsToHistory; + rule.OnAddedPortsToHistory += OnAddedPortsToHistory; + } + + } + else + { + FirewallRules = []; + foreach (var rule in SelectedProfile.Firewall_Rules) + { + FirewallRules.Add(new FirewallRuleViewModel(rule, value)); + var addedRule = FirewallRules.Last(); + addedRule.OnRuleChanged += OnRulesChanged; + addedRule.OnAddingPortsToHistory += OnAddingPortsToHistory; + addedRule.OnAddedPortsToHistory += OnAddedPortsToHistory; + } + } + OnPropertyChanged(nameof(FirewallRules)); + } + field = value; + } + } + + /// + /// Represents the currently selected user profile in the system or application, + /// allowing access to profile-specific settings, preferences, or data. + /// + public ProfileInfo SelectedProfile + { + get; + set + { + if (value == field) + return; + field = value; + if (value != null) + ProfileName = value.Name; + OnPropertyChanged(); + } + } + + /// + /// Represents the search query or functionality used to filter or locate specific data + /// within the context of the containing class. + /// + public string Search + { + get; + set + { + if (value == field) + return; + + field = value; + + // Start searching... + if (!_searchDisabled) + { + IsSearching = true; + _searchDispatcherTimer.Start(); + } + + OnPropertyChanged(); + } + } + + /// + /// Indicates whether a search operation is currently in progress within the associated context + /// or functionality of the class. + /// + public bool IsSearching + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates whether the profile filter panel is currently open or closed. + /// This property is used to control the visibility state of the profile filter UI element + /// in the associated view or component. + /// + public bool ProfileFilterIsOpen + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Represents a view model that handles the display and management of profile filter tags + /// within the application's user interface, enabling users to customize and refine data filtering + /// based on specific tag selections. + /// + public ICollectionView ProfileFilterTagsView { get; set; } + + /// + /// A collection of tags used to filter and categorize user profiles based on specific metadata. + /// + public ObservableCollection ProfileFilterTags { get; set; } = []; + + /// + /// Specifies whether the profile filter matches any of the tags provided. + /// This property evaluates to true if any tag within the filter criteria aligns + /// with the tags associated with the profile being evaluated. + /// + public bool ProfileFilterTagsMatchAny + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } = GlobalStaticConfiguration.Profile_TagsMatchAny; + + /// + /// Represents the collection of filter tags that must all match to include a profile. + /// This property enforces strict matching criteria by requiring every tag in the collection + /// to be satisfied for the profile to be considered valid according to the applied filter. + /// + public bool ProfileFilterTagsMatchAll + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Indicates whether the profile filter has been configured or applied + /// in the current context. + /// + public bool IsProfileFilterSet + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + } + } + + /// + /// Represents a storage mechanism for maintaining the expanded or collapsed state + /// of groups within a user interface that supports hierarchical or grouped views. + /// + public GroupExpanderStateStore GroupExpanderStateStore { get; } = new(); + + /// + /// Indicates whether the profile width can be modified dynamically during runtime. + /// This variable typically reflects configuration settings or operational conditions + /// that determine if adjustments to the profile width are allowed. + /// + private bool _canProfileWidthChange = true; + + /// + /// Represents the temporary width value of a profile, used for intermediate calculations + /// or adjustments before being finalized or applied. + /// + private double _tempProfileWidth; + + /// + /// Indicates whether the profile view should be expanded, providing a toggle mechanism + /// for showing or hiding additional profile details in the UI. + /// + public bool ExpandProfileView + { + get; + set + { + if (value == field) + return; + + if (!_isLoading) + SettingsManager.Current.Firewall_ExpandProfileView = value; + + field = value; + + if (_canProfileWidthChange) + ResizeProfile(false); + + OnPropertyChanged(); + } + } + + /// + /// Represents the width of the profile, typically used to define or configure + /// dimensions in a specific context where profile measurements are required. + /// + public GridLength ProfileWidth + { + get; + set + { + if (value == field) + return; + + if (!_isLoading && Math.Abs(value.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > + GlobalStaticConfiguration.Profile_FloatPointFix) // Do not save the size when collapsed + SettingsManager.Current.Firewall_ProfileWidth = value.Value; + + field = value; + + if (_canProfileWidthChange) + ResizeProfile(true); + + OnPropertyChanged(); + } + } + + #endregion + + #endregion + + #region Constructor + + /// + /// Encapsulates the logic and data binding required to handle + /// firewall configuration and visualization in the user interface. + /// + private FirewallViewModel() + { + _isLoading = true; + + FirewallRules = []; + + // Profiles + CreateTags(); + + ProfileFilterTagsView = CollectionViewSource.GetDefaultView(ProfileFilterTags); + ProfileFilterTagsView.SortDescriptions.Add(new SortDescription(nameof(ProfileFilterTagsInfo.Name), + ListSortDirection.Ascending)); + + SetProfilesView(new ProfileFilterInfo()); + + ProfileManager.OnProfilesUpdated += ProfileManager_OnProfilesUpdated; + + _searchDispatcherTimer.Interval = GlobalStaticConfiguration.SearchDispatcherTimerTimeSpan; + _searchDispatcherTimer.Tick += SearchDispatcherTimer_Tick; + + LoadSettings(); + _isLoading = false; + } + + /// + /// Get an instance avoiding the base initialization. Solely used on cloning. + /// + /// True for cloning. + private FirewallViewModel(bool isClone) + { + if (!isClone) + return; + _isLoading = true; + IsClone = true; + _isLoading = false; + } + + #endregion + + + #region Methods + + #region Events + + public event CommandExecutedEventHandler CommandExecuted; + + public delegate void CommandExecutedEventHandler(object sender, RoutedEventArgs args); + + /// + /// Update config if a rule has been changed. + /// + /// + /// + private void OnRulesChanged(object sender, EventArgs e) + { + UpdateRulesConfig(); + } + + /// + /// Store values if ports are being added to the history. + /// + /// + /// + private void OnAddingPortsToHistory(object sender, EventArgs e) + { + if (sender is not FirewallRuleViewModel) + return; + foreach (var rule in FirewallRules) + rule.StorePortValues(); + } + + /// + /// Restore port values after the history has been changed. + /// + /// + /// + private void OnAddedPortsToHistory(object sender, EventArgs e) + { + if (sender is not FirewallRuleViewModel) + return; + foreach (var rule in FirewallRules) + rule.RestorePortValues(); + } + + /// + /// Toggle the view. + /// + public void OnViewHide() + { + IsViewActive = !IsViewActive; + if (IsViewActive) + UpdatePortHistorySeparator(); + } + + /// + /// Method triggered when the associated view becomes visible + /// because the settings dialog has been closed. + /// + public void OnViewVisible() + { + IsViewActive = true; + bool combined = SettingsManager.Current.Firewall_CombinePortHistory; + if (SettingsManager.Current.Firewall_LocalPortsHistoryConfig.Count + < FirewallRuleViewModel.LocalPortsHistory.Count) + { + FirewallRuleViewModel.LocalPortsHistory.Clear(); + if (combined) + FirewallRuleViewModel.CombinedPortsHistory.Clear(); + } + if (SettingsManager.Current.Firewall_RemotePortsHistoryConfig.Count + < FirewallRuleViewModel.RemotePortsHistory.Count) + { + FirewallRuleViewModel.RemotePortsHistory.Clear(); + if (combined) + FirewallRuleViewModel.CombinedPortsHistory.Clear(); + } + MaxLengthHistory = SettingsManager.Current.Firewall_MaxLengthHistory; + foreach (var rule in FirewallRules) + { + if (combined) + { + rule.StorePortValues(); + rule.LocalPortsHistoryView = CollectionViewSource + .GetDefaultView(FirewallRuleViewModel.CombinedPortsHistory); + rule.RemotePortsHistoryView = CollectionViewSource + .GetDefaultView(FirewallRuleViewModel.CombinedPortsHistory); + } + else + { + rule.LocalPortsHistoryView = CollectionViewSource + .GetDefaultView(FirewallRuleViewModel.LocalPortsHistory); + rule.RemotePortsHistoryView = CollectionViewSource + .GetDefaultView(FirewallRuleViewModel.RemotePortsHistory); + } + rule.MaxLengthHistory = SettingsManager.Current.Firewall_MaxLengthHistory; + } + // Also calls FirewallRuleViewModel.UpdateCombinedPortHistory() + UpdatePortHistorySeparator(); + if (!combined) return; + foreach (var rule in FirewallRules) + rule.RestorePortValues(); + } + + /// Handles the ProfilesUpdated event from the ProfileManager. + /// This method is triggered when the profiles are updated and ensures the profile tags are refreshed and the profiles view is updated. + /// The source of the event, typically the ProfileManager instance. + /// An EventArgs object that contains no event data. + private void ProfileManager_OnProfilesUpdated(object sender, EventArgs e) + { + CreateTags(); + + RefreshProfiles(); + } + + /// + /// Handles the Tick event of the SearchDispatcherTimer. + /// Responsible for executing periodic operations related to the search functionality, + /// such as updating search results or triggering dependent actions at the timer's interval. + /// + /// The source of the event, typically the timer object. + /// An instance of EventArgs containing event data. + private void SearchDispatcherTimer_Tick(object sender, EventArgs e) + { + _searchDispatcherTimer.Stop(); + + RefreshProfiles(); + + IsSearching = false; + } + + public void OnProfilesLoaded() + { + var firstGroupProfiles = (Profiles?.Groups?.FirstOrDefault() as CollectionViewGroup)?.Items; + if (firstGroupProfiles?.Count is 0 or null) + LoadRulesFromSettings(); + else + SelectedProfile = firstGroupProfiles.FirstOrDefault() as ProfileInfo; + } + + #endregion Events + + #region ProfileMethods + + /// + /// Provides functionality to manage and adjust the size of a user profile + /// or related visual elements based on specified parameters or constraints. + /// + private void ResizeProfile(bool dueToChangedSize) + { + _canProfileWidthChange = false; + + if (dueToChangedSize) + { + ExpandProfileView = Math.Abs(ProfileWidth.Value - GlobalStaticConfiguration.Profile_WidthCollapsed) > + GlobalStaticConfiguration.Profile_FloatPointFix; + } + else + { + if (ExpandProfileView) + { + ProfileWidth = + Math.Abs(_tempProfileWidth - GlobalStaticConfiguration.Profile_WidthCollapsed) < + GlobalStaticConfiguration.Profile_FloatPointFix + ? new GridLength(GlobalStaticConfiguration.Profile_DefaultWidthExpanded) + : new GridLength(_tempProfileWidth); + } + else + { + _tempProfileWidth = ProfileWidth.Value; + ProfileWidth = new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + } + } + + _canProfileWidthChange = true; + } + + /// + /// Populates and updates the list of profile filter tags based on the tags present + /// in the profiles where the firewall is enabled. + /// + /// + /// This method retrieves all tags associated with profiles in all groups + /// that have the firewall enabled. It ensures the `ProfileFilterTags` collection + /// is synchronized with the current set of tags, removing any outdated tags and + /// adding any new ones. Duplicate tags are not allowed, and the tags are maintained + /// in a consistent state. + /// + private void CreateTags() + { + var tags = ProfileManager.LoadedProfileFileData?.Groups.SelectMany(x => x.Profiles).Where(x => x.Firewall_Enabled) + .SelectMany(x => x.TagsCollection).Distinct().ToList(); + if (tags is null) + return; + var tagSet = new HashSet(tags); + + for (var i = ProfileFilterTags.Count - 1; i >= 0; i--) + { + if (!tagSet.Contains(ProfileFilterTags[i].Name)) + ProfileFilterTags.RemoveAt(i); + } + + var existingTagNames = new HashSet(ProfileFilterTags.Select(ft => ft.Name)); + + foreach (var tag in tags.Where(tag => !existingTagNames.Contains(tag))) + { + ProfileFilterTags.Add(new ProfileFilterTagsInfo(false, tag)); + } + } + + /// + /// Represents the View responsible for configuring and displaying + /// profile settings within the application. + /// + private void SetProfilesView(ProfileFilterInfo filter, ProfileInfo profile = null) + { + Profiles = new CollectionViewSource + { + Source = ProfileManager.LoadedProfileFileData? + .Groups.SelectMany(x => x.Profiles).Where(x => x.Firewall_Enabled && ( + string.IsNullOrEmpty(filter.Search) || + x.Name.IndexOf(filter.Search, StringComparison.OrdinalIgnoreCase) > -1) && ( + // If no tags are selected, show all profiles + (!filter.Tags.Any()) || + // Any tag can match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.Any && + filter.Tags.Any(tag => x.TagsCollection.Contains(tag))) || + // All tags must match + (filter.TagsFilterMatch == ProfileFilterTagsMatch.All && + filter.Tags.All(tag => x.TagsCollection.Contains(tag)))) + ).OrderBy(x => x.Group).ThenBy(x => x.Name) + }.View; + + Profiles.GroupDescriptions.Add(new PropertyGroupDescription(nameof(ProfileInfo.Group))); + + // Set the specific profile or first if null + SelectedProfile = null; + + if (profile != null) + SelectedProfile = Profiles.Cast().FirstOrDefault(x => x.Equals(profile)) ?? + Profiles.Cast().FirstOrDefault(); + else + SelectedProfile = Profiles.Cast().FirstOrDefault(); + } + + /// + /// Refreshes the list of user profiles by retrieving the latest data + /// and updating the application state accordingly. + /// + private void RefreshProfiles() + { + if (!IsViewActive) + return; + + var filter = new ProfileFilterInfo + { + Search = Search, + Tags = [.. ProfileFilterTags.Where(x => x.IsSelected).Select(x => x.Name)], + TagsFilterMatch = ProfileFilterTagsMatchAny ? ProfileFilterTagsMatch.Any : ProfileFilterTagsMatch.All + }; + + SetProfilesView(filter, SelectedProfile); + + IsProfileFilterSet = !string.IsNullOrEmpty(filter.Search) || filter.Tags.Any(); + } + + #endregion + + #region Action and commands + #region ProfileCommands + /// + /// Command responsible for applying the profile configuration settings. + /// This command encapsulates the logic required to execute changes to + /// user-defined or system-defined profile configurations. + /// + public ICommand ApplyProfileConfigCommand => new RelayCommand(_ => ApplyProfileProfileAction()); + + /// + /// Executes the action that applies the configuration settings stored in the selected profile. + /// + /// + /// This method is invoked as part of the ApplyProfileConfigCommand, which is bound to a user action + /// in the view layer. It asynchronously applies configuration settings from the currently + /// selected profile to the appropriate system components. + /// + private void ApplyProfileProfileAction() + { + ApplyConfigurationFromProfile().ConfigureAwait(false); + } + + /// + /// Command used to initiate the process of adding a new profile, + /// facilitating the binding between the user interface and the + /// corresponding business logic. + /// + public ICommand AddProfileCommand => new RelayCommand(_ => AddProfileAction()); + + /// + /// Represents an action that handles the addition of a new profile, + /// including the associated logic and state management necessary + /// to persist and update profile-related information. + /// + private void AddProfileAction() + { + ProfileDialogManager + .ShowAddProfileDialog(Application.Current.MainWindow, this, null, null, ApplicationName.Firewall) + .ConfigureAwait(false); + } + + private bool ModifyProfile_CanExecute(object obj) + { + return SelectedProfile is { IsDynamic: false }; + } + + /// + /// Command responsible for handling the execution of the profile editing functionality + /// within the associated view model. + /// + public ICommand EditProfileCommand => new RelayCommand(_ => EditProfileAction(), ModifyProfile_CanExecute); + + /// + /// Handles the action to edit the currently selected profile in the application. + /// This method invokes the profile editing dialog through the + /// and passes the current application window, the view model, and the selected profile to it. + /// The dialog allows users to modify the details of the selected profile. + /// + private void EditProfileAction() + { + ProfileDialogManager.ShowEditProfileDialog(Application.Current.MainWindow, this, SelectedProfile) + .ConfigureAwait(false); + } + + /// + /// Command encapsulating the logic to copy the current configuration or selected + /// settings as a new profile within the application. + /// + public ICommand CopyAsProfileCommand => new RelayCommand(_ => CopyAsProfileAction(), ModifyProfile_CanExecute); + + /// + /// Defines an action responsible for creating a copy of an existing profile + /// in a system or application, preserving all configurations and settings + /// associated with the original profile. + /// + private void CopyAsProfileAction() + { + ProfileDialogManager.ShowCopyAsProfileDialog(Application.Current.MainWindow, this, SelectedProfile) + .ConfigureAwait(false); + } + + /// + /// Command that facilitates the deletion of a user profile + /// by encapsulating the associated logic and providing + /// the necessary bindings for UI interaction. + /// + public ICommand DeleteProfileCommand => new RelayCommand(_ => DeleteProfileAction(), ModifyProfile_CanExecute); + + /// + /// Represents an action responsible for handling the deletion of a user or application profile, + /// including any associated resources or configurations tied to that profile. + /// + private async void DeleteProfileAction() + { + try + { + await ProfileDialogManager + .ShowDeleteProfileDialog(Application.Current.MainWindow, this, + new List { SelectedProfile }) + .ConfigureAwait(false); + // Reload rules from configuration on last profile deletion + if (Profiles?.IsEmpty ?? true) + { + SelectedProfile = null; + await Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, + new Action(LoadRulesFromSettings)); + ProfileName = null; + } + + UpdateRulesConfig(); + } + catch + { + // Prevent a process crash on errors. + } + } + + /// + /// Command responsible for handling the editing of a group, typically invoked to open + /// or manage the group editing interface and apply updated changes. + /// + public ICommand EditGroupCommand => new RelayCommand(EditGroupAction); + + private void EditGroupAction(object group) + { + ProfileDialogManager + .ShowEditGroupDialog(Application.Current.MainWindow, this, ProfileManager.GetGroupByName($"{group}")) + .ConfigureAwait(false); + } + + /// + /// Command that encapsulates the logic for opening and applying a profile filter + /// within the associated view model, allowing dynamic adjustments to the profile display. + /// + public ICommand OpenProfileFilterCommand => new RelayCommand(_ => OpenProfileFilterAction()); + + /// + /// Defines an action responsible for filtering profiles based on specific criteria + /// within a system or application, enabling targeted operations on the resulting set of profiles. + /// + private void OpenProfileFilterAction() + { + ProfileFilterIsOpen = true; + } + + /// + /// Command responsible for applying a profile-based filter to the data + /// or view model, enabling targeted operations based on the selected profile criteria. + /// + public ICommand ApplyProfileFilterCommand => new RelayCommand(_ => ApplyProfileFilterAction()); + + /// + /// Defines an action responsible for applying a specific profile-based filter + /// to a data set or collection, modifying its state based on the selected profile criteria. + /// + private void ApplyProfileFilterAction() + { + RefreshProfiles(); + + ProfileFilterIsOpen = false; + } + + /// + /// Command used to clear the applied profile filters, resetting the view or data + /// to its unfiltered state within the context of the associated ViewModel. + /// + public ICommand ClearProfileFilterCommand => new RelayCommand(_ => ClearProfileFilterAction()); + + /// + /// Represents an action responsible for clearing the applied profile filters, + /// resetting the state to display unfiltered results. + /// + private void ClearProfileFilterAction() + { + _searchDisabled = true; + Search = string.Empty; + _searchDisabled = false; + + foreach (var tag in ProfileFilterTags) + tag.IsSelected = false; + + RefreshProfiles(); + + IsProfileFilterSet = false; + ProfileFilterIsOpen = false; + } + + /// + /// Command used to trigger the expansion of all profile groups + /// in the associated view model, typically for improving visibility + /// and accessibility of group details. + /// + public ICommand ExpandAllProfileGroupsCommand => new RelayCommand(_ => ExpandAllProfileGroupsAction()); + + /// + /// Represents the action responsible for expanding all profile groups + /// within a given context, typically used to enhance visibility or access + /// to grouped profile information in the UI. + /// + private void ExpandAllProfileGroupsAction() + { + SetIsExpandedForAllProfileGroups(true); + } + + /// + /// Command responsible for collapsing all profile groups in the associated view model, + /// typically used to improve user navigation and focus by reducing the visible complexity. + /// + public ICommand CollapseAllProfileGroupsCommand => new RelayCommand(_ => CollapseAllProfileGroupsAction()); + + /// Executes the action to collapse all profile groups in the firewall view. + /// This method sets the expansion state of all profile groups to false, effectively collapsing them. + /// Remarks: + /// - It uses the `SetIsExpandedForAllProfileGroups` method to modify the expansion state. + /// - This action is typically invoked by the related command bound to the UI. + /// Dependencies: + /// - Requires access to the profile group expansion state via `SetIsExpandedForAllProfileGroups + private void CollapseAllProfileGroupsAction() + { + SetIsExpandedForAllProfileGroups(false); + } + + /// + /// Updates the expanded state for all profile groups in the data set. + /// + /// A boolean value indicating whether all profile groups should be expanded (true) or collapsed (false). + private void SetIsExpandedForAllProfileGroups(bool isExpanded) + { + foreach (var group in Profiles.Groups.Cast()) + GroupExpanderStateStore[group.Name.ToString()] = isExpanded; + } + #endregion ProfileCommands + + /// + /// Command responsible for applying the current configuration settings, + /// ensuring the changes are validated and executed within the context of the application. + /// + public ICommand ApplyConfigurationCommand => + new RelayCommand(_ => ApplyConfigurationAction(), ApplyConfiguration_CanExecute); + + /// + /// Determines whether the apply configuration command can execute + /// based on the current state of the application. + /// + /// An optional parameter used for evaluating the command's execution status. + /// True if the command can execute; otherwise, false. + private static bool ApplyConfiguration_CanExecute(object parameter) + { + return !(Application.Current.MainWindow as MetroWindow)?.IsAnyDialogOpen ?? false; + //!ConfigurationManager.Current.IsChildWindowOpen; + } + + /// + /// Represents an action responsible for applying configuration settings + /// to a specified system or component. It encapsulates the logic required + /// to validate, process, and enforce the provided configuration details. + /// + private void ApplyConfigurationAction() + { + ApplyConfiguration().ConfigureAwait(false); + CommandExecuted?.Invoke(this, null); + } + + public ICommand OpenWindowsFirewallCommand => new RelayCommand(_ => OpenWindowsFirewallAction()); + + private void OpenWindowsFirewallAction() + { + if (IsClone) + { + CommandExecuted?.Invoke(this, null); + return; + } + PowerShellHelper.ExecuteCommand("WF.msc"); + CommandExecuted?.Invoke(this, null); + } + + public ICommand DeleteAllRulesCommand => new RelayCommand(_ => DeleteAllRulesAction()); + + private void DeleteAllRulesAction() { + FirewallRules.Clear(); + UpdateRulesConfig(); + CommandExecuted?.Invoke(this, null); + } + + /// + /// Command for . + /// + public ICommand AddRuleCommand => new RelayCommand(_ => AddRuleAction()); + + /// + /// Action for . + /// + private void AddRuleAction() + { + AddRule(); + } + + /// + /// Adds a new firewall rule. + /// + private void AddRule() + { + FirewallRules ??= []; + + FirewallRules.Add(new FirewallRuleViewModel { ProfileName = ProfileName }); + var addedRule = FirewallRules.Last(); + addedRule.OnRuleChanged += OnRulesChanged; + addedRule.OnAddedPortsToHistory += OnAddedPortsToHistory; + addedRule.OnAddingPortsToHistory += OnAddingPortsToHistory; + UpdateRulesConfig(); + CommandExecuted?.Invoke(this, null); + } + + /// + /// Command responsible for handling the deletion of rules within the context + /// of the associated ViewModel or business logic. Encapsulates the logic + /// required to execute the rule removal process. + /// + public ICommand DeleteRulesCommand => new RelayCommand(_ => DeleteRulesAction()); + + /// + /// Represents an action responsible for handling the deletion of rules + /// within a specific system or application context. + /// + private void DeleteRulesAction() + { + DeleteRules(); + CommandExecuted?.Invoke(this, null); + } + + /// + /// Deletes the selected firewall rules from the collection of firewall rules. + /// + private void DeleteRules() + { + if (SelectedRules?.Count > 0) + { + var rulesToDelete = SelectedRules.Cast().ToList(); + foreach (FirewallRuleViewModel rule in rulesToDelete) + { + rule.OnRuleChanged -= OnRulesChanged; + rule.OnAddingPortsToHistory -= OnAddingPortsToHistory; + rule.OnAddedPortsToHistory -= OnAddedPortsToHistory; + FirewallRules?.Remove(rule); + } + UpdateRulesConfig(); + return; + } + + var ruleToDelete = SelectedRule ?? FirewallRules?.LastOrDefault(); + ruleToDelete?.OnRuleChanged -= OnRulesChanged; + ruleToDelete?.OnAddingPortsToHistory -= OnAddingPortsToHistory; + ruleToDelete?.OnAddedPortsToHistory -= OnAddedPortsToHistory; + // May be null, but Remove() handles this returning false. + FirewallRules?.Remove(ruleToDelete); + UpdateRulesConfig(); + } + + /// + /// Command for deleting the shown rules in the Windows firewall. + /// + public static ICommand DeleteWindowsRulesCommand => new RelayCommand(_ => DeleteWindowsRulesAction()); + + /// + /// Clear the Windows firewall rules starting with "NwM_". + /// + private static void DeleteWindowsRulesAction() + { + Firewall.ClearAllRules(); + } + + #endregion + + #region Configuration + + /// + /// Load the settings from . + /// + private void LoadSettings() + { + _loadingSettings = true; + // Load port history + var localPortHistory = SettingsManager.Current.Firewall_LocalPortsHistoryConfig; + if (localPortHistory?.Count > 0) + FirewallRuleViewModel.LocalPortsHistory = new ObservableCollection(localPortHistory); + var remotePortsHistory = SettingsManager.Current.Firewall_RemotePortsHistoryConfig; + if (remotePortsHistory?.Count > 0) + FirewallRuleViewModel.RemotePortsHistory = new ObservableCollection(remotePortsHistory); + if (SettingsManager.Current.Firewall_CombinePortHistory) + FirewallRuleViewModel.UpdateCombinedPortsHistory(); + MaxLengthHistory = SettingsManager.Current.Firewall_MaxLengthHistory; + // Set a profile name + if (SelectedProfile is not null) + ProfileName = SelectedProfile.Name; + + // Load firewall rules from settings if no profile is selected + if (SelectedProfile is null) + LoadRulesFromSettings(); + + _loadingSettings = false; + + _lastUseWindowsPortSyntax = SettingsManager.Current.Firewall_UseWindowsPortSyntax; + + // Load profile view settings + ExpandProfileView = SettingsManager.Current.Firewall_ExpandProfileView; + + ProfileWidth = ExpandProfileView + ? new GridLength(SettingsManager.Current.Firewall_ProfileWidth) + : new GridLength(GlobalStaticConfiguration.Profile_WidthCollapsed); + + _tempProfileWidth = SettingsManager.Current.Firewall_ProfileWidth; + } + + /// + /// Load the firewall rules from settings if no profiles are available. + /// + private void LoadRulesFromSettings() + { + SelectedProfile = null; + ProfileName = null; + FirewallRules = []; + if (SettingsManager.Current.Firewall_FirewallRules is null) + return; + foreach (var rule in SettingsManager.Current.Firewall_FirewallRules) + { + FirewallRules.Add(new FirewallRuleViewModel(rule, SelectedProfile?.Name)); + var addedRule = FirewallRules.Last(); + addedRule.OnRuleChanged += OnRulesChanged; + addedRule.OnAddingPortsToHistory += OnAddingPortsToHistory; + addedRule.OnAddedPortsToHistory += OnAddedPortsToHistory; + } + OnPropertyChanged(nameof(FirewallRules)); + } + + /// + /// Update the configuration for either the current profile or the default config + /// if no profile is selected. + /// + private void UpdateRulesConfig() + { + if ((Profiles?.IsEmpty ?? true) && !IsClone) + { + FirewallRulesConfig = FirewallRules?.Select(x => x?.ToRule(true)).ToList(); + } + else if (!IsClone) + { + SelectedProfile?.Firewall_Rules = FirewallRules?.Select(x => x?.ToRule(true)).ToList(); + ProfileManager.LoadedProfileFileData?.ProfilesChanged = true; + } + OnPropertyChanged(nameof(FirewallRules)); + OnPropertyChanged(nameof(FirewallRulesInterface)); + } + + /// + /// Replace the separator in the port histories if the settings have been changed. + /// + private void UpdatePortHistorySeparator() + { + // Check whether UseWindowsPortSyntax has been changed. + var currentWindowsPortSyntax = SettingsManager.Current.Firewall_UseWindowsPortSyntax; + if (_lastUseWindowsPortSyntax == currentWindowsPortSyntax) + return; + // Replace history separators + var localPortsHistory = FirewallRuleViewModel.LocalPortsHistory; + var remotePortsHistory = FirewallRuleViewModel.RemotePortsHistory; + char fromSeparator = currentWindowsPortSyntax ? ';' : ','; + char toSeparator = currentWindowsPortSyntax ? ',' : ';'; + if (localPortsHistory != null) + { + FirewallRuleViewModel.LocalPortsHistory = + new ObservableCollection(localPortsHistory + .Select(x => x?.Replace(fromSeparator, toSeparator))); + } + + if (remotePortsHistory != null) + { + FirewallRuleViewModel.RemotePortsHistory = + new ObservableCollection(remotePortsHistory + .Select(x => x?.Replace(fromSeparator, toSeparator))); + } + + // Update the combined ports history if enabled + foreach (var rule in FirewallRules) + { + if (SettingsManager.Current.Firewall_CombinePortHistory) + FirewallRuleViewModel.UpdateCombinedPortsHistory(); + rule.PortWatermark = rule.PortWatermark?.Replace(fromSeparator, toSeparator); + } + + _lastUseWindowsPortSyntax = currentWindowsPortSyntax; + } + + /// + /// Apply the firewall rules to Windows firewall configuration. + /// + private async Task ApplyConfiguration() + { + if (IsConfigurationRunning || IsClone) + return; + IsConfigurationRunning = true; + + try + { + var firewall = new Firewall(); + + var firewallRules = FirewallRules + .Select(ruleVm => ruleVm.ToRule()).Where(r => r != null).ToList(); + + await firewall.ApplyRulesAsync(firewallRules); + } + finally + { + IsConfigurationRunning = false; + } + } + + /// + /// Apply the firewall rules from a profile to the Windows firewall configuration. + /// + private async Task ApplyConfigurationFromProfile() + { + if (SelectedProfile is null) + return; + if (IsConfigurationRunning) + return; + IsConfigurationRunning = true; + + foreach (var rule in SelectedProfile.Firewall_Rules) + { + FirewallRules = + [ + new FirewallRuleViewModel(rule, ProfileName) + ]; + + await ApplyConfiguration(); + } + } + + #endregion + + /// + /// Clone this instance. + /// + /// Cloned instance. + public object Clone() + { + var clone = new FirewallViewModel(true) + { + FirewallRules = new ObservableCollection( + FirewallRules.Select(rule => rule.Clone() as FirewallRuleViewModel)), + }; + return clone; + } + #endregion Methods + +} \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/ProfileViewModel.cs b/Source/NETworkManager/ViewModels/ProfileViewModel.cs index 153027f21e..116684d4bd 100644 --- a/Source/NETworkManager/ViewModels/ProfileViewModel.cs +++ b/Source/NETworkManager/ViewModels/ProfileViewModel.cs @@ -16,12 +16,14 @@ using System.Threading.Tasks; using System.Windows.Data; using System.Windows.Input; +using NETworkManager.Interfaces.ViewModels; +using NETworkManager.Models.Firewall; // ReSharper disable InconsistentNaming namespace NETworkManager.ViewModels; -public class ProfileViewModel : ViewModelBase +public class ProfileViewModel : ViewModelBase, IProfileViewModel { #region Constructor @@ -39,6 +41,14 @@ public ProfileViewModel(Action saveCommand, Action saveCommand, Action GetFirewallRules() + { + List list = []; + list.AddRange(Firewall_ViewModel?.FirewallRules?.Select(model => model?.ToRule(true)) + .Where(model => model != null) + ?? []); + return list; + } #endregion #region Variables @@ -396,6 +418,12 @@ public string Name { if (value == _name) return; + if ((Firewall_Enabled || _isLoading) && !value.Contains('|')) + { + Firewall_ViewModel?.ProfileName = value; + OnPropertyChanged(nameof(Firewall_ViewModel)); + OnPropertyChanged(nameof(Firewall_IViewModel)); + } _name = value; OnPropertyChanged(); @@ -3205,9 +3233,44 @@ public string IPGeolocation_Host OnPropertyChanged(); } } - #endregion + #region Firewall + + public bool Firewall_Enabled + { + get; + set + { + if (value == field) + return; + + field = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(Name)); + } + } + + public IFirewallViewModel Firewall_IViewModel + { + get => Firewall_ViewModel; + set => Firewall_ViewModel = (FirewallViewModel)value; + } + + public FirewallViewModel Firewall_ViewModel + { + get; + set + { + if (value == field) + return; + field = value; + OnPropertyChanged(); + } + } + + #endregion + #endregion #region ICommands & Actions @@ -3256,6 +3319,5 @@ private void RemoveTagAction(object param) TagsCollection.Remove(tag); } - #endregion } \ No newline at end of file diff --git a/Source/NETworkManager/ViewModels/SettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsViewModel.cs index e7a668933b..7b1fb97bd5 100644 --- a/Source/NETworkManager/ViewModels/SettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsViewModel.cs @@ -144,6 +144,7 @@ public SettingsViewInfo SelectedSettingsView private SNTPLookupSettingsView _sntpLookupSettingsView; private WakeOnLANSettingsView _wakeOnLANSettingsView; private BitCalculatorSettingsView _bitCalculatorSettingsView; + private FirewallSettingsView _firewallSettingsView; #endregion @@ -345,6 +346,11 @@ private void ChangeSettingsContent(SettingsViewInfo settingsViewInfo) SettingsContent = _bitCalculatorSettingsView; break; + case SettingsName.Firewall: + _firewallSettingsView ??= new FirewallSettingsView(); + + SettingsContent = _firewallSettingsView; + break; } } diff --git a/Source/NETworkManager/Views/FirewallSettingsView.xaml b/Source/NETworkManager/Views/FirewallSettingsView.xaml new file mode 100644 index 0000000000..fa67b87fe6 --- /dev/null +++ b/Source/NETworkManager/Views/FirewallSettingsView.xaml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/NETworkManager/Views/FirewallSettingsView.xaml.cs b/Source/NETworkManager/Views/FirewallSettingsView.xaml.cs new file mode 100644 index 0000000000..980d3a17bf --- /dev/null +++ b/Source/NETworkManager/Views/FirewallSettingsView.xaml.cs @@ -0,0 +1,24 @@ +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +/// +/// View for the firewall settings. +/// +public partial class FirewallSettingsView +{ + /// + /// DataContext for the view. + /// + private readonly FirewallSettingsViewModel _viewModel = + FirewallSettingsViewModel.Instance; + + /// + /// Construct the view. + /// + public FirewallSettingsView() + { + InitializeComponent(); + DataContext = _viewModel; + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/FirewallView.xaml b/Source/NETworkManager/Views/FirewallView.xaml new file mode 100644 index 0000000000..566aacc45c --- /dev/null +++ b/Source/NETworkManager/Views/FirewallView.xaml @@ -0,0 +1,982 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/NETworkManager/Views/FirewallView.xaml.cs b/Source/NETworkManager/Views/FirewallView.xaml.cs new file mode 100644 index 0000000000..0b812e5f9c --- /dev/null +++ b/Source/NETworkManager/Views/FirewallView.xaml.cs @@ -0,0 +1,81 @@ +using System.Windows; +using System.Windows.Controls; +using NETworkManager.ViewModels; + +namespace NETworkManager.Views; + +/// +/// Code-behind for the firewall view. +/// +public partial class FirewallView +{ + /// + /// View model for the view. + /// + private readonly FirewallViewModel _viewModel; + + /// + /// Initialize view. + /// + public FirewallView() + { + InitializeComponent(); + + _viewModel = FirewallViewModel.Instance as FirewallViewModel; + DataContext = _viewModel; + _viewModel?.CommandExecuted += AnyButton_OnClick; + FirewallRuleGrid.DataContext = _viewModel; + } + + #region Events + /// + /// Set data context for menus. + /// + /// + /// + private void ContextMenu_Opened(object sender, RoutedEventArgs e) + { + if (sender is ContextMenu menu) + menu.DataContext = _viewModel; + } + + /// + /// Offload event for toggling view to the view model. + /// + public void OnViewHide() + { + _viewModel.OnViewHide(); + if (_viewModel.IsViewActive) + FirewallRuleGrid?.RestoreRuleGridFocus(); + } + + /// + /// Offload event for showing the view after editing settings to view model. + /// + public void OnViewVisible() + { + _viewModel.OnViewVisible(); + FirewallRuleGrid?.RestoreRuleGridFocus(); + } + + /// + /// Set the focus to the RuleGrid when loading is finished. + /// + /// + /// + private void FirewallView_OnLoaded(object sender, RoutedEventArgs e) + { + FirewallRuleGrid?.RestoreRuleGridFocus(); + } + #endregion + + /// + /// Set the focus to the rule grid when a button is clicked. + /// + /// + /// + private void AnyButton_OnClick(object sender, RoutedEventArgs e) + { + FirewallRuleGrid?.RestoreRuleGridFocus(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager/Views/ProfileChildWindow.xaml b/Source/NETworkManager/Views/ProfileChildWindow.xaml index 151444aa27..824fa17b4e 100644 --- a/Source/NETworkManager/Views/ProfileChildWindow.xaml +++ b/Source/NETworkManager/Views/ProfileChildWindow.xaml @@ -14,11 +14,13 @@ xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF" + xmlns:typedProxies="clr-namespace:NETworkManager.Utilities.WPF.TypedBindingProxies;assembly=NETworkManager.Utilities.WPF" xmlns:interactivity="http://schemas.microsoft.com/xaml/behaviors" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" xmlns:profiles="clr-namespace:NETworkManager.Profiles;assembly=NETworkManager.Profiles" + xmlns:controls="clr-namespace:NETworkManager.Controls" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" - xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" + xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow" CloseButtonCommand="{Binding CancelCommand}" Style="{StaticResource DefaultChildWindow}" Loaded="ChildWindow_OnLoaded" @@ -42,6 +44,8 @@ + + @@ -60,6 +64,7 @@ + @@ -771,7 +776,7 @@ - + @@ -1081,6 +1086,53 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1138,7 +1190,7 @@ Value="{x:Static profiles:ProfileName.PuTTY}"> - + + + + @@ -1210,7 +1270,8 @@ + SelectedIndex="{Binding ElementName=ListBoxViews, Path=SelectedIndex}" + SelectionChanged="TabControl_OnSelectionChanged"> diff --git a/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs b/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs index d5b59dd028..641af64788 100644 --- a/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs +++ b/Source/NETworkManager/Views/ProfileChildWindow.xaml.cs @@ -3,6 +3,8 @@ using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; +using NETworkManager.Localization.Resources; +using NETworkManager.ViewModels; namespace NETworkManager.Views; @@ -27,11 +29,24 @@ public ProfileChildWindow(Window parentWindow) }; } + private void Firewall_ViewModelOnCommandExecuted(object sender, RoutedEventArgs args) + { + FirewallRuleGrid?.RestoreRuleGridFocus(); + } + + /// + /// - Set the focus to Name on the General Tab. + /// - Subscribe to ViewModel events as necessary. + /// + /// + /// private void ChildWindow_OnLoaded(object sender, RoutedEventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(delegate { TextBoxName.Focus(); + (DataContext as ProfileViewModel) + ?.Firewall_ViewModel?.CommandExecuted += Firewall_ViewModelOnCommandExecuted; })); } @@ -52,4 +67,25 @@ private void ScrollViewer_ManipulationBoundaryFeedback(object sender, Manipulati { e.Handled = true; } + + /// + /// Handle application views when their tab is selected. + /// + /// + /// + private void TabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (!IsLoaded || !IsVisible) + return; + + if (sender is not TabControl tabControl) + return; + if (tabControl.SelectedItem is not TabItem item) + return; + if (item.Header.ToString() == Strings.Firewall) + { + FirewallRuleGrid?.RestoreRuleGridFocus(); + } + // else if (other TabItems ...) + } } \ No newline at end of file diff --git a/Source/NETworkManager/Views/ProfilesView.xaml b/Source/NETworkManager/Views/ProfilesView.xaml index 1506748b6f..e0006cb903 100644 --- a/Source/NETworkManager/Views/ProfilesView.xaml +++ b/Source/NETworkManager/Views/ProfilesView.xaml @@ -422,6 +422,10 @@ Header="{x:Static localization:Strings.Whois}" Binding="{Binding (profiles:ProfileInfo.Whois_Enabled)}" SortMemberPath="Whois_Enabled" MinWidth="80" Width="Auto" /> + -Release date: **xx.xx.2025** +Release date: **xx.xx.2026** | File | `SHA256` | | ---- | -------- | @@ -19,12 +19,26 @@ Release date: **xx.xx.2025** ## What's new? +- Firewall application has been added for adding NETworkManager controlled Windows firewall rules with profile support. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) + ## Improvements +- Reuse existing validators and converters where applicable. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Support commands exceeding the commandline limit in PowershellHelper. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Fix warnings in NetworkInterfaceView. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Add various converters and validators [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Allow to click validation errors out of the way. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Add validation error template on checkboxes. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Allow style changes when ViewModels recognize configuration errors. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) + ## Bug Fixes +- Fix null dereferences in various validators and converters. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) + ## Dependencies, Refactoring & Documentation - Code cleanup & refactoring - Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) - Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) +- Add code documentation in various places. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Refactor ListHelper.Modify as generic method. diff --git a/Website/docs/img/firewall--addProfile.png b/Website/docs/img/firewall--addProfile.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc74b0d7cd888c53a2ffaf287b9f6745e868ff6 GIT binary patch literal 102094 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

Hi=sN=_mj(RWA4cV?a(Vhp5B4dXT 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

yU0Y>Ahw;pug%O97wgf6<9 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 W_mckS=iFN(L1Lb+elF{r5}E+>V}Gjv literal 0 HcmV?d00001 diff --git a/Website/docs/img/firewall--settings.png b/Website/docs/img/firewall--settings.png new file mode 100644 index 0000000000000000000000000000000000000000..cf24710b0f56de0bc09eb3d59435910b2c57214b GIT binary patch literal 50096 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 Date: Mon, 2 Mar 2026 14:40:05 +0100 Subject: [PATCH 20/21] Firewall App PR: Replace changelog pr placeholder with actual pr number. Signed-off-by: Manuel Ullmann --- Website/docs/changelog/next-release.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index ab0b5fbd86..053895e911 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -19,26 +19,26 @@ Release date: **xx.xx.2026** ## What's new? -- Firewall application has been added for adding NETworkManager controlled Windows firewall rules with profile support. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Firewall application has been added for adding NETworkManager controlled Windows firewall rules with profile support. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) ## Improvements -- Reuse existing validators and converters where applicable. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Support commands exceeding the commandline limit in PowershellHelper. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Fix warnings in NetworkInterfaceView. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Add various converters and validators [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Allow to click validation errors out of the way. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Add validation error template on checkboxes. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) -- Allow style changes when ViewModels recognize configuration errors. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Reuse existing validators and converters where applicable. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Support commands exceeding the commandline limit in PowershellHelper. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Fix warnings in NetworkInterfaceView. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Add various converters and validators [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Allow to click validation errors out of the way. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Add validation error template on checkboxes. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) +- Allow style changes when ViewModels recognize configuration errors. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) ## Bug Fixes -- Fix null dereferences in various validators and converters. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Fix null dereferences in various validators and converters. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) ## Dependencies, Refactoring & Documentation - Code cleanup & refactoring - Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration) - Dependencies updated via [#dependabot](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Fdependabot) -- Add code documentation in various places. [#xxxx](https://github.com/BornToBeRoot/NETworkManager/pull/xxxx) +- Add code documentation in various places. [#3353](https://github.com/BornToBeRoot/NETworkManager/pull/3353) - Refactor ListHelper.Modify as generic method. From ef95654ed5d4efe2c63a8f565ae28195c55557c0 Mon Sep 17 00:00:00 2001 From: Manuel Ullmann Date: Mon, 2 Mar 2026 15:47:48 +0100 Subject: [PATCH 21/21] Add powershell argument quote sanitizing in Firewall model. Signed-off-by: Manuel Ullmann --- Source/NETworkManager.Models/Firewall/Firewall.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Source/NETworkManager.Models/Firewall/Firewall.cs b/Source/NETworkManager.Models/Firewall/Firewall.cs index 594ca8951f..22d85ae2df 100644 --- a/Source/NETworkManager.Models/Firewall/Firewall.cs +++ b/Source/NETworkManager.Models/Firewall/Firewall.cs @@ -42,9 +42,9 @@ private bool ApplyRules(List rules) string nextRule = string.Empty; try { - nextRule += $"New-NetFirewallRule -DisplayName '{rule.Name}'"; + nextRule += $"New-NetFirewallRule -DisplayName '{SanitizeStringArguments(rule.Name)}'"; if (!string.IsNullOrEmpty(rule.Description)) - nextRule += $" -Description '{rule.Description}'"; + nextRule += $" -Description '{SanitizeStringArguments(rule.Description)}'"; nextRule += $" -Direction {Enum.GetName(rule.Direction)}"; if (rule.LocalPorts.Count > 0 && rule.Protocol is FirewallProtocol.TCP or FirewallProtocol.UDP) @@ -64,7 +64,7 @@ private bool ApplyRules(List rules) try { if (File.Exists(rule.Program.Name)) - nextRule += $" -Program '{rule.Program.Name}'"; + nextRule += $" -Program '{SanitizeStringArguments(rule.Program.Name)}'"; else continue; } @@ -125,6 +125,11 @@ private static string GetClearAllRulesCommand() { return $"Remove-NetFirewallRule -DisplayName 'NwM_*'"; } + + private static string SanitizeStringArguments(string value) + { + return value.Replace("'", "''"); + } ///

/// Applies firewall rules asynchronously by invoking the ApplyRules method in a separate task.