\$("#error_msg").hide();
\$.each(data, function(i, item) {
+ // Handle NAT information
+ const src_extra = (item.src_ret && item.src_ip !== item.src_ret) ?
+ '<span style="color:#FFFFFF;"> ></span> ' +
+ '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.src_ret || '') + '">' +
+ '<span style="color:#FFFFFF;">' + (item.src_ret || '') + '</span></a>' : '';
+ const dst_extra = (item.dst_ret && item.dst_ip !== item.dst_ret) ?
+ '<span style="color:#FFFFFF;"> ></span> ' +
+ '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.dst_ret || '') + '">' +
+ '<span style="color:#FFFFFF;">' + (item.dst_ret || '') + '</span></a>' : '';
+ const sport_extra = (item.src_ret_port && item.src_port !== item.src_ret_port) ?
+ '<span style="color:#FFFFFF;"> ></span> ' +
+ '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.src_ret_port || '') + '" target="_blank" title="' + (item.src_ret_service || '') + '">' +
+ '<span style="color:#FFFFFF;">' + (item.src_ret_port || '') + '</span></a>' : '';
+ const dport_extra = (item.dst_ret_port && item.dst_port !== item.dst_ret_port) ?
+ '<span style="color:#FFFFFF;">></span> ' +
+ '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.dst_ret_port || '') + '" target="_blank" title="' + (item.dst_ret_service || '') + '">' +
+ '<span style="color:#FFFFFF;">' + (item.dst_ret_port || '') + '</span></a>' : '';
+
const html = [
'<tr>',
'<td style="text-align:center">' + (item.protocol || '') + '</td>',
'<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
'<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.src_ip || '') + '"><span style="color:#FFFFFF;">' + (item.src_ip || '') + '</span></a>',
+ src_extra,
'</td>',
'<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
'<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.src_port || '') + '" target="_blank" title="' + (item.src_service || '') + '">',
'<span style="color:#FFFFFF;">' + (item.src_port || '') + '</span>',
'</a>',
+ sport_extra,
'</td>',
'<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
'<a href="country.cgi#' + encodeURIComponent(item.src_country || '') + '">',
'</td>',
'<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
'<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.dst_ip || '') + '"><span style="color:#FFFFFF;">' + (item.dst_ip || '') + '</span></a>',
+ dst_extra,
'</td>',
'<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
'<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.dst_port || '') + '" target="_blank" title="' + (item.dst_service || '') + '">',
'<span style="color:#FFFFFF;">' + (item.dst_port || '') + '</span>',
'</a>',
+ dport_extra,
'</td>',
'<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
'<a href="country.cgi#' + encodeURIComponent(item.dst_country || '') + '">',
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
+# Provides JSON data for the connections table, filtered by zone, IP, port, #
+# and protocol, including NAT information. #
+# #
###############################################################################
use strict;
}
my $sip_colour = ipcolour($sip);
- my $dip_colour = ipcolour($dip);
+ # Use destination network color for DNAT
+ my $dip_colour = $dip_ret && $dip ne $dip_ret ? ipcolour($dip_ret) : ipcolour($dip);
# Filter by selected zones
my $matches_zone = !@selected_zones;
if ($dport && $dport < 1024) {
$dserv = uc(getservbyport($dport, lc($l4proto))) || '';
}
+ my $sserv_ret = '';
+ if ($sport_ret && $sport_ret < 1024) {
+ $sserv_ret = uc(getservbyport($sport_ret, lc($l4proto))) || '';
+ }
+ my $dserv_ret = '';
+ if ($dport_ret && $dport_ret < 1024) {
+ $dserv_ret = uc(getservbyport($dport_ret, lc($l4proto))) || '';
+ }
# Resolve country codes and flag icons
- my $srcccode = &Location::Functions::lookup_country_code($sip_ret) || '';
+ my $srcccode = &Location::Functions::lookup_country_code($sip_ret || $sip) || '';
my $src_flag_icon = &Location::Functions::get_flag_icon($srcccode) || '/images/flags/unknown.png';
if ($src_flag_icon && $src_flag_icon !~ m!^/images/flags/!) {
$src_flag_icon = "/images/flags/" . lc($srcccode) . ".png" if $srcccode;
}
- my $dstccode = &Location::Functions::lookup_country_code($dip_ret) || '';
+ my $dstccode = &Location::Functions::lookup_country_code($dip_ret || $dip) || '';
my $dst_flag_icon = &Location::Functions::get_flag_icon($dstccode) || '/images/flags/unknown.png';
if ($dst_flag_icon && $dst_flag_icon !~ m!^/images/flags/!) {
$dst_flag_icon = "/images/flags/" . lc($dstccode) . ".png" if $dstccode;
push @table_data, {
protocol => $l4proto,
src_ip => $sip,
+ src_ret => $sip_ret,
+ dst_ip => $dip,
+ dst_ret => $dip_ret,
src_port => $sport,
+ src_ret_port => $sport_ret,
+ dst_port => $dport,
+ dst_ret_port => $dport_ret,
src_service => $sserv,
+ src_ret_service => $sserv_ret,
+ dst_service => $dserv,
+ dst_ret_service => $dserv_ret,
src_colour => $sip_colour,
+ dst_colour => $dip_colour,
src_country => $srcccode,
src_flag_icon => $src_flag_icon,
- dst_ip => $dip,
- dst_port => $dport,
- dst_service => $dserv,
- dst_colour => $dip_colour,
dst_country => $dstccode,
dst_flag_icon => $dst_flag_icon,
bytes_in => &General::formatBytes($bytes[0]),
'compression' => 'Kompression:',
'computer to modem rate' => 'Übertragungsrate zwischen Computer und Modem:',
'concentrator name' => 'Name des Konzentrators:',
+'configuration file' => 'Konfigurationsdatei',
'confirmation' => 'Bestätigung',
'connect' => 'OpenVPN Start / Verbinden',
'connect the modem' => 'Das Modem anschließen',
'donation' => 'Spenden',
'donation-link' => 'https://www.paypal.com/de_DE/DE/i/btn/btn_donateCC_LG.gif',
'donation-text' => '<strong>IPFire</strong> wird von Freiwilligen in ihrer Freizeit betreut und weiterentwickelt. Um dieses Projekt am Leben zu erhalten, entstehen uns natürlich auch Kosten. Wenn Sie uns unterstützen wollen, würden wir uns über eine kleine Spende sehr freuen.',
+'done' => 'Fertig',
'dos charset' => 'DOS-Zeichensatz',
'down and up speed' => 'Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein <br /> und klicken Sie danach auf <i>Speichern</i>.',
'downfall gather data sampling' => 'Downfall/Gather Data Sampling',
'encrypted' => 'Verschlüsselt',
'encryption' => 'Verschlüsselung:',
'end address' => 'Endadresse:',
+'endpoint' => 'Endpoint',
+'endpoint address' => 'Endpoint-Adresse',
+'endpoint port' => 'Endpoint-Port',
'enter ack class' => 'Legen Sie hier die ACK-Klasse fest <br /> und klicken Sie danach auf <i>Speichern</i>.',
'enter data' => 'Geben Sie die Daten ein <br /> und klicken Sie danach auf <i>Speichern</i>.',
'entropy' => 'Entropie',
'ike lifetime should be between 1 and 24 hours' => 'IKE Lebensdauer sollte zwischen 1 und 24 Stunden betragen.',
'imei' => 'IMEI',
'import' => 'Import',
+'import connection' => 'Eine Verbindung importieren',
'importkey' => 'PSK importieren',
'imsi' => 'IMSI',
'in' => 'Ein',
'invalid domain name' => 'Ungültiger Domainname.',
'invalid downlink speed' => 'Ungültige Downlink-Gerschwindigkeit.',
'invalid end address' => 'Ungültige Endadresse.',
+'invalid endpoint' => 'Ungültige Gegenstelle',
+'invalid endpoint address' => 'Ungültige Endpoint-Adresse',
'invalid fixed ip address' => 'Ungültige feste IP-Adresse',
'invalid fixed mac address' => 'Ungültige feste MAC-Adresse',
'invalid hostname' => 'Ungültiger Hostname.',
'invalid input for state or province' => 'Ungültige Eingabe für Bundesstaat oder Provinz.',
'invalid input for valid till days' => 'Ungültige Eingabe für Gültig bis (Tage).',
'invalid ip' => 'Ungültige IP-Adresse',
+'invalid ip address' => 'Ungültige IP-Adresse',
'invalid ip or hostname' => 'Ungültige IP-Addresse oder Hostname',
'invalid keep time' => 'Die Aufbewahrungszeit muss eine gültige Zahl sein',
+'invalid keepalive interval' => 'Ungültiges Keepalive-Interval',
'invalid key' => 'Ungültiger Schlüssel.',
'invalid loaded file' => 'Ungültige geladene Datei',
'invalid local-remote id' => 'Local-Id und Remote-Id dürfen nicht gleich sein, und müssen einem "@"-Zeichen beginnen (in der strongSwan-Terminologie handelt es sich dabei um leftid und rightid).',
'invalid minimum object size' => 'Ungültige min. Objektgröße.',
'invalid mtu input' => 'Ungültige MTU',
'invalid netmask' => 'Ungültige Netzwerkmaske',
+'invalid network' => 'Ungültiges Netzwerk',
'invalid port' => 'Ungültiger Port. Bitte gültige Portnummer eingeben.',
'invalid port list' => 'Portlisten-Syntax lautet: port[,port]... wobei port in /etc/services enthalten ist, alternativ Portnummer',
'invalid primary dns' => 'Ungültiger primärer DNS.',
'local ip address' => 'Lokale IP-Adresse',
'local master' => 'Local Master',
'local ntp server specified but not enabled' => 'Lokaler NTP-Server angegeben aber nicht aktiviert',
+'local port' => 'Lokaler Port',
'local subnet' => 'Lokales Subnetz:',
'local subnet is invalid' => 'Lokales Subnetz ist ungültig.',
+'local subnets' => 'Lokale Subnetze',
'local vpn hostname/ip' => 'Lokaler VPN Hostname/IP',
'localkey' => 'Localkey',
'localkeyfile' => 'Localkeyfile',
'mailmethod' => 'Mail Methode',
'mailprogramm' => 'Mail Programm',
'main page' => 'Startseite',
+'malformed preshared key' => 'Ungültiger Pre-Shared Key',
+'malformed private key' => 'Ungültiger privater Schlüssel',
+'malformed public key' => 'Ungültiger öffentlicher Schlüssel',
'manage ovpn' => '5. Tunnel Management',
'manage printers' => 'Drucker verwalten',
'manage shares' => 'Freigaben verwalten',
'pakfire ago' => 'her.',
'pakfire already busy' => 'Pakfire führt bereits eine Aufgabe aus. Bitte versuchen Sie es später erneut.',
'pakfire available addons' => 'Verfügbare Add-ons:',
+'pakfire check deps' => 'Überprüfung der Abhängigkeiten...',
'pakfire configuration' => 'Pakfire Konfiguration',
'pakfire confirm upgrades' => 'Möchten Sie alle Upgrades installieren?',
'pakfire core update auto' => 'Core- und Add-on-Updates automatisch installieren:',
'pakfire health check' => 'Mirrors auf Erreichbarkeit prüfen (Ping):',
'pakfire install' => 'Installieren',
'pakfire install description' => 'Bitte wählen Sie ein oder mehrere Add-Ons zur Installation aus.',
-'pakfire install package' => 'Sie möchten folgende Pakete installieren: ',
+'pakfire install package' => 'Zu installierende Pakete:',
'pakfire installed addons' => 'Installierte Add-ons:',
'pakfire invalid tree' => '',
'pakfire last core list update' => 'Letztes Corelisten Update ist',
'psk' => 'PSK',
'ptr' => 'PTR',
'ptr lookup failed' => 'Reverse Lookup gescheitert',
+'public key' => 'Öffentlicher Schlüssel',
'pulse' => 'Puls',
'pulse dial' => 'Pulswahl:',
'qos add subclass' => 'Unterklasse hinzufügen',
'qos enter bandwidths' => 'Bitte geben Sie ihre Downstream- und Upstream-Bandbreite an!',
'qos graphs' => 'Qos Diagramme',
'qos warning' => 'Die Regel <strong>muss</strong> wieder gespeichert werden, ansonsten wird sie verworfen!',
+'qr code' => 'QR-Code',
'quick playlist' => 'Quick Playlist',
'ram' => 'RAM-Speicher',
'rdns' => 'rDNS',
'remote logging' => 'Entfernte Protokollierung',
'remote subnet' => 'Entferntes Subnetz:',
'remote subnet is invalid' => 'Entferntes Subnetz ist ungültig.',
+'remote subnets' => 'Entfernte Subnetze',
'removable device advice' => 'Stecken Sie ein Gerät an, aktualisieren Sie und binden Sie es vor der Benutzung ein. Melden Sie das Gerät vorm Entfernen ab.',
'remove' => 'Löschen',
'remove ca certificate' => 'CA-Zertifikat entfernen',
'week-graph' => 'Woche',
'weekly firewallhits' => 'wöchentliche Firewalltreffer',
'weeks' => 'Wochen',
+'wg client pool' => 'Client-Pool',
+'wg create host-to-net peer' => 'Einen neuen Host-zu-Netz-Peer erstellen',
+'wg create net-to-net peer' => 'Einen neuen Netz-zu-Netz-Peer erstellen',
+'wg dns' => 'DNS',
+'wg download configuration' => 'Konfiguration herunterladen',
+'wg download configuration file' => 'Konfigurationsdatei herunterladen',
+'wg edit host-to-net peer' => 'Host-zu-Netz-Peer bearbeiten',
+'wg edit net-to-net peer' => 'Netz-zu-Netz-Peer bearbeiten',
+'wg host to net client settings' => 'Host-zu-Netz-Client-Einstellungen',
+'wg import peer' => 'Peer importieren',
+'wg invalid client dns' => 'Ungültige Client-DNS-Adresse',
+'wg invalid client pool' => 'Ungültiger Client-Pool',
+'wg invalid endpoint address' => 'Ungültige Endpoint-Adresse',
+'wg invalid endpoint port' => 'Ungültiger Endpoint-Port',
+'wg invalid keepalive interval' => 'Ungültiger Keepalive-Intervall (Muss zwischen 0 und 65535 sein)',
+'wg invalid local subnet' => 'Ungültiges lokales Subnetz',
+'wg invalid name' => 'Ungültiger Name (Nur Buchstaben, Zahlen, Leerzeichen und Bindestrich erlaubt)',
+'wg invalid psk' => 'Ungültiger Pre-Shared-Key',
+'wg invalid public key' => 'Ungültiger öffentlicher Schlüssel',
+'wg invalid remote subnet' => 'Ungültiges entferntes Subnetz',
+'wg keepalive interval' => 'Keepalive-Intervall',
+'wg leave empty to automatically select' => 'Leer lassen für automatische Wahl',
+'wg missing allowed ips' => 'AllowedIPs fehlt',
+'wg missing endpoint address' => 'Fehlende Endpoint-Adresse',
+'wg missing endpoint port' => 'Fehlerder Endpoint-Port',
+'wg missing port' => 'Fehlender Port',
+'wg missing private key' => 'Fehlender privater Schlüssel',
+'wg missing public key' => 'Fehlender öffentlicher Schlüssel',
+'wg name is already used' => 'Dieser Name ist bereits in Verwendung',
+'wg no local subnets' => 'Keine lokalen Subnetze angegeben',
+'wg no more free addresses in pool' => 'Keine freien Adressen mehr im Pool',
+'wg no remote subnets' => 'Keine entfernten Subnetze angegeben',
+'wg peer configuration' => 'Peer-Konfiguration',
+'wg peer does not exist' => 'Peer existiert nicht',
+'wg rw peers' => 'WireGuard-Roadwarrior-Peers',
+'wg scan the qr code' => 'Scannen Sie den QR-Code, um die WireGuard-Konfiguration in ein mobiles Endgerät zu importieren.',
+'wg show configuration qrcode' => 'Konfigurations-QR-Code anzeigen',
+'wg warning configuration only shown once' => 'Achtung: Diese WireGuard-Konfigurationsdatei wird nur dieses eine Mal angezeigt, da sie privates Schlüsselmaterial enthält, was nicht in IPFire gespeichert wird.',
'whitelisted' => 'Ausgenommen',
'whois results from' => 'WHOIS-Ergebnisse von',
'wildcards' => 'Wildcards',
'all services' => 'All Services',
'all updates installed' => 'All updates installed',
'allmsg' => 'show all',
+'allowed subnets' => 'Allowed Subnets',
'alt dialup' => 'Dialup',
'alt home' => 'Home',
'alt information' => 'Information',
'compression' => 'Compression:',
'computer to modem rate' => 'Computer to modem rate:',
'concentrator name' => 'Concentrator name:',
+'configuration file' => 'Configuration File',
'confirmation' => 'confirmation',
'connect' => 'OVPN Start / Connect',
'connect the modem' => 'Connect the modem',
'donation-link' => 'https://www.paypal.com/en_US/GB/i/btn/btn_donateCC_LG.gif',
'donation-text' => '<strong>IPFire</strong> is driven and maintained by volunteers in their free time. To keep this project running costs incurred, if you like to support us we would be pleased by a small donation.',
'done' => 'Do it',
+'done' => 'Done',
'dos charset' => 'DOS Charset',
'down and up speed' => 'Enter your Down- and Uplink-Speed <br /> and then press <i>Save</i>.',
'downfall gather data sampling' => 'Downfall/Gather Data Sampling',
'encrypted' => 'Encrypted',
'encryption' => 'Encryption:',
'end address' => 'End address:',
+'endpoint' => 'Endpoint',
+'endpoint address' => 'Endpoint Address',
+'endpoint port' => 'Endpoint Port',
'enter ack class' => 'Enter the ACK- Class <br /> and then press <i>Save</i>.',
'enter data' => 'Enter your settings <br /> and then press <i>Save</i>.',
'entropy' => 'Entropy',
'fwhost type' => 'Type',
'fwhost used' => 'Used',
'fwhost welcome' => 'Over here, you can group single hosts, networks and services together, which will creating new rules more easy and faster.',
+'fwhost wg peers' => 'WireGuard Peers',
'fwhost wo subnet' => '(without subnet)',
'g.dtm' => 'TO BE REMOVED',
'g.lite' => 'TO BE REMOVED',
'ike lifetime should be between 1 and 24 hours' => 'IKE lifetime should be between 1 and 24 hours.',
'imei' => 'IMEI',
'import' => 'Import',
+'import connection' => 'Import a Connection',
'importkey' => 'Import PSK',
'imsi' => 'IMSI',
'in' => 'In',
'invalid domain name' => 'Invalid domain name.',
'invalid downlink speed' => 'Invalid downlink speed.',
'invalid end address' => 'Invalid end address.',
+'invalid endpoint' => 'Invalid Endpoint',
+'invalid endpoint address' => 'Invalid Endpoint Address',
'invalid fixed ip address' => 'Invalid fixed IP address',
'invalid fixed mac address' => 'Invalid fixed MAC address',
'invalid hostname' => 'Invalid hostname.',
'invalid input for subscription code' => 'Invalid input for subscription code',
'invalid input for valid till days' => 'Invalid input for Valid till (days).',
'invalid ip' => 'Invalid IP Address',
+'invalid ip address' => 'Invalid IP Address',
'invalid ip or hostname' => 'Invalid IP Address or Hostname',
'invalid keep time' => 'Keep time must be a valid number',
+'invalid keepalive interval' => 'Invalid Keepalive Interval',
'invalid key' => 'Invalid key.',
'invalid loaded file' => 'Invalid loaded file',
'invalid local-remote id' => 'local & remote id must not be equal and begin with a "@" sign. These are leftid and rightid in strongswan terminology.',
'invalid minimum object size' => 'Invalid minimum object size.',
'invalid mtu input' => 'Invalid MTU',
'invalid netmask' => 'Invalid netmask',
+'invalid network' => 'Invalid Network',
'invalid port' => 'Invalid port. Must be a valid port number.',
'invalid port list' => 'Port list syntax is: port[,port]... where port is in /etc/services or number',
'invalid primary dns' => 'Invalid primary DNS.',
'local ip address' => 'Local IP Address',
'local master' => 'Local Master',
'local ntp server specified but not enabled' => 'Local NTP server specified but not enabled',
+'local port' => 'Local Port',
'local subnet' => 'Local subnet:',
'local subnet is invalid' => 'Local subnet is invalid.',
+'local subnets' => 'Local Subnets',
'local vpn hostname/ip' => 'Local VPN Hostname/IP',
'localkey' => 'Localkey',
'localkeyfile' => 'Localkeyfile',
'mailmethod' => 'Mailmethod',
'mailprogramm' => 'Mailprogramm',
'main page' => 'Main page',
+'malformed preshared key' => 'Malformed Pre-Shared Key',
+'malformed private key' => 'Malformed Private Key',
+'malformed public key' => 'Malformed Public Key',
'manage ovpn' => '5. Tunnel Management:',
'manage printers' => 'manage printers',
'manage shares' => 'Manage Shares',
'pakfire ago' => 'ago.',
'pakfire already busy' => 'Pakfire is already performing a task. Please try again later.',
'pakfire available addons' => 'Available Add-ons:',
+'pakfire check deps' => 'Checking dependencies...',
'pakfire configuration' => 'Pakfire Configuration',
'pakfire confirm upgrades' => 'Do you want to install all upgrades?',
'pakfire core update auto' => 'Install core and add-on updates automatically:',
'psk' => 'PSK',
'ptr' => 'PTR',
'ptr lookup failed' => 'Reverse lookup failed',
+'public key' => 'Public Key',
'pulse' => 'Pulse',
'pulse dial' => 'Pulse dial:',
'qos add subclass' => 'Add subclass',
'qos enter bandwidths' => 'You will need to enter your downstream and upstream bandwidth!',
'qos graphs' => 'Qos Graphs',
'qos warning' => 'The rule <strong>must</strong> be saved, otherwise it will be discarded!',
+'qr code' => 'QR Code',
'quick control' => 'Quick Control',
'quick playlist' => 'Quick Playlist',
'ram' => 'RAM',
'reload' => 'reload',
'remark' => 'Remark',
'remark title' => 'Remark:',
+'remarks' => 'Remarks',
'remote access' => 'Remote access',
'remote announce' => 'Remote Announce',
'remote browse sync' => 'Remote Browse Sync',
'remote logging' => 'Remote logging',
'remote subnet' => 'Remote subnet:',
'remote subnet is invalid' => 'Remote subnet is invalid.',
+'remote subnets' => 'Remote Subnets',
'removable device advice' => 'Plug in a device, refresh, select and mount before usage. Umount before removal.',
'remove' => 'Remove',
'remove ca certificate' => 'Remove CA certificate',
'root user password' => 'Root password',
'route subnet is invalid' => 'Additional push route subnet is invalid',
'router ip' => 'Router IP address:',
+'routing' => 'Routing',
'routing table entries' => 'Routing Table Entries',
'rsvd dst port overlap' => 'Destination Port Range overlaps a port reserved for IPFire:',
'rsvd src port overlap' => 'Source Port Range overlaps a port reserved for IPFire:',
'weekly firewallhits' => 'weekly firewallhits',
'weeks' => 'Weeks',
'wg' => 'WireGuard',
+'wg client configuration file' => 'WireGuard Client Configuration File',
+'wg client pool' => 'Client Pool',
+'wg create host-to-net peer' => 'Create A New Host-To-Net Peer',
+'wg create net-to-net peer' => 'Create A New Net-To-Net Peer',
+'wg create peer' => 'Create A New Peer',
+'wg dns' => 'DNS',
+'wg download configuration' => 'Download Configuration',
+'wg download configuration file' => 'Download the configuration file',
+'wg edit host-to-net peer' => 'Edit Host-To-Net Peer',
+'wg edit net-to-net peer' => 'Edit Net-To-Net Peer',
+'wg edit peer' => 'Edit Peer',
+'wg host to net client settings' => 'Host-To-Net Client Settings',
+'wg import peer' => 'Import Peer',
+'wg invalid client dns' => 'Invalid client DNS address',
+'wg invalid client pool' => 'Invalid client pool',
+'wg invalid endpoint address' => 'Invalid endpoint address',
+'wg invalid endpoint port' => 'Invalid endpoint port',
+'wg invalid keepalive interval' => 'Invalid Keepalive Interval (Must be between 0 and 65535)',
+'wg invalid local subnet' => 'Invalid local subnet',
+'wg invalid name' => 'Invalid name (Only letters, numbers, space and hyphen are allowed)',
+'wg invalid psk' => 'Invalid pre-shared key',
+'wg invalid public key' => 'Invalid public key',
+'wg invalid remote subnet' => 'Invalid remote subnet',
+'wg keepalive interval' => 'Keepalive Interval',
+'wg leave empty to automatically select' => 'Leave empty to automatically select',
+'wg missing allowed ips' => 'Missing AllowedIPs',
+'wg missing endpoint address' => 'Missing Endpoint Address',
+'wg missing endpoint port' => 'Missing Endpoint Port',
+'wg missing port' => 'Missing Port',
+'wg missing private key' => 'Missing Private Key',
+'wg missing public key' => 'Missing Public Key',
+'wg name is already used' => 'The name is already in use',
+'wg no local subnets' => 'No local subnets given',
+'wg no more free addresses in pool' => 'No more free addresses in pool',
+'wg no remote subnets' => 'No remote subnets given',
+'wg peer configuration' => 'Peer Configuration',
+'wg peer does not exist' => 'Peer does not exist',
+'wg pre-shared key (optional)' => 'Pre-Shared Key (optional)',
+'wg rw peers' => 'WireGuard Roadwarrior Peers',
+'wg scan the qr code' => 'Scan the QR code to import the WireGuard configuration into a mobile client.',
+'wg show configuration qrcode' => 'Show Configuration QR Code',
+'wg warning configuration only shown once' => 'Attention: This WireGuard configuration file will only be shown this one time as it contains private key material that is not being stored on IPFire.',
'whitelisted' => 'Whitelisted',
'whois results from' => 'WHOIS results from',
'wildcards' => 'Wildcards',