diff --git a/cluster/forms.py b/cluster/forms.py new file mode 100644 index 0000000..52a5643 --- /dev/null +++ b/cluster/forms.py @@ -0,0 +1,139 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Column, HTML, Layout, Row, Submit +from django import forms +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ + +from .models import ClusterSettings, Worker + + +class WorkerForm(forms.ModelForm): + class Meta: + model = Worker + fields = ['name', 'enabled', 'ip_lock', 'ip_address', 'country', 'city', 'hostname'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['name'].label = _("Name") + self.fields['enabled'].label = _("Enabled") + self.fields['ip_lock'].label = _("IP Lock") + self.fields['ip_address'].label = _("IP Address") + self.fields['country'].label = _("Country") + self.fields['city'].label = _("City") + self.fields['hostname'].label = _("Hostname") + + back_label = _("Back") + delete_label = _("Delete") + self.helper = FormHelper() + self.helper.form_method = 'post' + + if self.instance.pk: + delete_html = f"{delete_label}" + else: + delete_html = '' + + self.helper.layout = Layout( + Row( + Column('name', css_class='form-group col-md-6 mb-0'), + Column('enabled', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('ip_lock', css_class='form-group col-md-6 mb-0'), + Column('ip_address', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('country', css_class='form-group col-md-4 mb-0'), + Column('city', css_class='form-group col-md-4 mb-0'), + Column('hostname', css_class='form-group col-md-4 mb-0'), + css_class='form-row' + ), + Row( + Column( + Submit('submit', _('Save'), css_class='btn btn-success'), + HTML(f' {back_label} '), + HTML(delete_html), + css_class='col-md-12'), + css_class='form-row' + ) + ) + + def clean(self): + cleaned_data = super().clean() + name = cleaned_data.get('name') + ip_lock = cleaned_data.get('ip_lock') + ip_address = cleaned_data.get('ip_address') + + if Worker.objects.filter(name=name).exclude(pk=self.instance.pk if self.instance else None).exists(): + raise ValidationError(_("A worker with that name already exists.")) + + if ip_lock and not ip_address: + raise ValidationError(_("IP Address is required when IP Lock is enabled.")) + + return cleaned_data + + +class ClusterSettingsForm(forms.ModelForm): + class Meta: + model = ClusterSettings + fields = [ + 'enabled', 'primary_enable_wireguard', 'stats_sync_interval', + 'stats_cache_interval', 'cluster_mode', 'restart_mode', 'worker_display' + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['enabled'].label = _("Cluster Enabled") + self.fields['primary_enable_wireguard'].label = _("Primary Enable WireGuard") + self.fields['stats_sync_interval'].label = _("Stats Sync Interval (seconds)") + self.fields['stats_cache_interval'].label = _("Stats Cache Interval (seconds)") + self.fields['cluster_mode'].label = _("Cluster Mode") + self.fields['restart_mode'].label = _("Restart Mode") + self.fields['worker_display'].label = _("Worker Display") + + back_label = _("Back") + self.helper = FormHelper() + self.helper.form_method = 'post' + + self.helper.layout = Layout( + Row( + Column('enabled', css_class='form-group col-md-6 mb-0'), + Column('primary_enable_wireguard', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('stats_sync_interval', css_class='form-group col-md-6 mb-0'), + Column('stats_cache_interval', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('cluster_mode', css_class='form-group col-md-6 mb-0'), + Column('restart_mode', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('worker_display', css_class='form-group col-md-12 mb-0'), + css_class='form-row' + ), + Row( + Column( + Submit('submit', _('Save'), css_class='btn btn-success'), + HTML(f' {back_label} '), + css_class='col-md-12'), + css_class='form-row' + ) + ) + + def clean(self): + cleaned_data = super().clean() + stats_sync_interval = cleaned_data.get('stats_sync_interval') + stats_cache_interval = cleaned_data.get('stats_cache_interval') + + if stats_sync_interval and stats_sync_interval < 10: + raise ValidationError(_("Stats sync interval must be at least 10 seconds.")) + + if stats_cache_interval and stats_cache_interval < 10: + raise ValidationError(_("Stats cache interval must be at least 10 seconds.")) + + return cleaned_data \ No newline at end of file diff --git a/cluster/views.py b/cluster/views.py index 60f00ef..29ca03e 100644 --- a/cluster/views.py +++ b/cluster/views.py @@ -1 +1,134 @@ -# Create your views here. +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.shortcuts import get_object_or_404, redirect, render +from django.utils.translation import gettext_lazy as _ + +from user_manager.models import UserAcl +from .forms import WorkerForm, ClusterSettingsForm +from .models import ClusterSettings, Worker + + +@login_required +def cluster_main(request): + """Main cluster page with workers list""" + if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=50).exists(): + return render(request, 'access_denied.html', {'page_title': _('Access Denied')}) + + page_title = _('Cluster') + workers = Worker.objects.all().order_by('name') + context = {'page_title': page_title, 'workers': workers} + return render(request, 'cluster/workers_list.html', context) + + +@login_required +def worker_manage(request): + """Add/Edit worker view""" + if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=50).exists(): + return render(request, 'access_denied.html', {'page_title': _('Access Denied')}) + + worker = None + if 'uuid' in request.GET: + worker = get_object_or_404(Worker, uuid=request.GET['uuid']) + form = WorkerForm(instance=worker) + page_title = _('Edit Worker: ') + worker.name + + if request.GET.get('action') == 'delete': + worker_name = worker.name + if request.GET.get('confirmation') == 'delete': + worker.delete() + messages.success(request, _('Worker deleted|Worker deleted: ') + worker_name) + return redirect('/cluster/') + else: + messages.warning(request, _('Worker not deleted|Invalid confirmation.')) + return redirect('/cluster/') + else: + form = WorkerForm() + page_title = _('Add Worker') + + if request.method == 'POST': + if worker: + form = WorkerForm(request.POST, instance=worker) + else: + form = WorkerForm(request.POST) + + if form.is_valid(): + worker = form.save() + if worker.pk: + messages.success(request, _('Worker updated|Worker updated: ') + worker.name) + else: + messages.success(request, _('Worker created|Worker created: ') + worker.name) + return redirect('/cluster/') + + form_description = { + 'size': 'col-lg-6', + 'content': _(''' +
Worker Configuration
+

Configure a cluster worker node that will synchronize with this primary instance.

+ +
Name
+

A unique name to identify this worker.

+ +
IP Address
+

The IP address of the worker node. Leave empty if IP lock is disabled.

+ +
IP Lock
+

When enabled, the worker can only connect from the specified IP address.

+ +
Location Information
+

Optional location details for this worker (country, city, hostname).

+ ''') + } + + context = { + 'page_title': page_title, + 'form': form, + 'worker': worker, + 'instance': worker, + 'form_description': form_description + } + return render(request, 'generic_form.html', context) + + +@login_required +def cluster_settings(request): + """Cluster settings configuration""" + if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=50).exists(): + return render(request, 'access_denied.html', {'page_title': _('Access Denied')}) + + cluster_settings, created = ClusterSettings.objects.get_or_create(name='cluster_settings') + page_title = _('Cluster Settings') + + if request.method == 'POST': + form = ClusterSettingsForm(request.POST, instance=cluster_settings) + if form.is_valid(): + form.save() + messages.success(request, _('Cluster settings updated successfully.')) + return redirect('/cluster/') + else: + form = ClusterSettingsForm(instance=cluster_settings) + + form_description = { + 'size': 'col-lg-6', + 'content': _(''' +
Cluster Mode
+

Configure how the cluster operates and synchronizes configurations between nodes.

+ +
Sync Intervals
+

Configure how frequently statistics and cache data are synchronized between cluster nodes.

+ +
Restart Mode
+

Choose whether WireGuard services should be automatically restarted when configurations change, or if manual intervention is required.

+ +
Worker Display
+

Select how workers should be identified in the interface - by name, server address, location, or a combination.

+ ''') + } + + context = { + 'page_title': page_title, + 'form': form, + 'cluster_settings': cluster_settings, + 'instance': cluster_settings, + 'form_description': form_description + } + return render(request, 'generic_form.html', context) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 3608d26..8fc6d66 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 3b80ea0..2adf95f 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-12 11:30-0300\n" +"POT-Creation-Date: 2025-08-14 22:07-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,208 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: cluster/forms.py:17 dns/forms.py:111 templates/cluster/workers_list.html:8 +#: templates/dns/static_host_list.html:68 +#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 +#: wireguard_peer/forms.py:10 +msgid "Name" +msgstr "Name" + +#: cluster/forms.py:18 templates/cluster/workers_list.html:24 +#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 +msgid "Enabled" +msgstr "Aktiviert" + +#: cluster/forms.py:19 +msgid "IP Lock" +msgstr "" + +#: cluster/forms.py:20 dns/forms.py:66 templates/cluster/workers_list.html:10 +#: templates/dns/static_host_list.html:18 +#: templates/firewall/manage_redirect_rule.html:43 +#: templates/firewall/manage_redirect_rule.html:67 +#: templates/firewall/manage_redirect_rule.html:68 +#: templates/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "IP‑Adresse" + +#: cluster/forms.py:21 +msgid "Country" +msgstr "" + +#: cluster/forms.py:22 +msgid "City" +msgstr "" + +#: cluster/forms.py:23 dns/forms.py:65 templates/dns/static_host_list.html:17 +msgid "Hostname" +msgstr "Hostname" + +#: cluster/forms.py:25 cluster/forms.py:95 dns/forms.py:25 dns/forms.py:67 +#: dns/forms.py:109 templates/firewall/manage_firewall_rule.html:380 +#: templates/firewall/manage_firewall_settings.html:60 +#: templates/firewall/manage_redirect_rule.html:85 +#: templates/wireguard/wireguard_manage_ip.html:42 +#: templates/wireguard/wireguard_manage_peer.html:170 +#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 +#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 +msgid "Back" +msgstr "Zurück" + +#: cluster/forms.py:26 dns/forms.py:68 dns/forms.py:110 +#: templates/firewall/manage_firewall_rule.html:382 +#: templates/firewall/manage_redirect_rule.html:86 +#: templates/wireguard/wireguard_manage_ip.html:43 +#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 +#: user_manager/forms.py:181 +msgid "Delete" +msgstr "Löschen" + +#: cluster/forms.py:54 cluster/forms.py:121 dns/forms.py:37 dns/forms.py:83 +#: dns/forms.py:134 templates/firewall/manage_firewall_rule.html:379 +#: templates/firewall/manage_firewall_settings.html:59 +#: templates/firewall/manage_redirect_rule.html:84 +#: templates/wireguard/wireguard_manage_ip.html:41 +#: templates/wireguard/wireguard_manage_peer.html:168 +#: templates/wireguard/wireguard_manage_server.html:130 +#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 +#: vpn_invite/forms.py:325 +msgid "Save" +msgstr "Speichern" + +#: cluster/forms.py:69 +msgid "A worker with that name already exists." +msgstr "Ein Worker mit diesem Namen existiert bereits." + +#: cluster/forms.py:72 +msgid "IP Address is required when IP Lock is enabled." +msgstr "" + +#: cluster/forms.py:87 +msgid "Cluster Enabled" +msgstr "Cluster aktiviert" + +#: cluster/forms.py:88 +msgid "Primary Enable WireGuard" +msgstr "" + +#: cluster/forms.py:89 +msgid "Stats Sync Interval (seconds)" +msgstr "" + +#: cluster/forms.py:90 +msgid "Stats Cache Interval (seconds)" +msgstr "" + +#: cluster/forms.py:91 +msgid "Cluster Mode" +msgstr "" + +#: cluster/forms.py:92 +msgid "Restart Mode" +msgstr "Neustart-Modus" + +#: cluster/forms.py:93 +msgid "Worker Display" +msgstr "" + +#: cluster/forms.py:134 +msgid "Stats sync interval must be at least 10 seconds." +msgstr "Statistik-Synchronisationsintervall muss mindestens 10 Sekunden betragen." +"Aktualisierungsintervall der Peer‑Liste muss mindestens 5 Sekunden betragen" + +#: cluster/forms.py:137 +msgid "Stats cache interval must be at least 10 seconds." +msgstr "Statistik-Cache-Intervall muss mindestens 10 Sekunden betragen." +"Aktualisierungsintervall der Peer‑Liste muss mindestens 5 Sekunden betragen" + +#: cluster/views.py:15 cluster/views.py:27 cluster/views.py:96 +#: templates/access_denied.html:9 +msgid "Access Denied" +msgstr "Zugriff verweigert" + +#: cluster/views.py:17 templates/base.html:185 +msgid "Cluster" +msgstr "" + +#: cluster/views.py:33 +msgid "Edit Worker: " +msgstr "Worker bearbeiten: " + +#: cluster/views.py:39 +msgid "Worker deleted|Worker deleted: " +msgstr "Worker gelöscht|Worker gelöscht: " + +#: cluster/views.py:42 +msgid "Worker not deleted|Invalid confirmation." +msgstr "Worker nicht gelöscht|Ungültige Bestätigung." + +#: cluster/views.py:46 templates/cluster/list_buttons.html:2 +msgid "Add Worker" +msgstr "Worker hinzufügen" + +#: cluster/views.py:57 +msgid "Worker updated|Worker updated: " +msgstr "Worker aktualisiert|Worker aktualisiert: " + +#: cluster/views.py:59 +msgid "Worker created|Worker created: " +msgstr "Worker erstellt|Worker erstellt: " + +#: cluster/views.py:64 +msgid "" +"\n" +"
Worker Configuration
\n" +"

Configure a cluster worker node that will synchronize with this " +"primary instance.

\n" +" \n" +"
Name
\n" +"

A unique name to identify this worker.

\n" +" \n" +"
IP Address
\n" +"

The IP address of the worker node. Leave empty if IP lock is " +"disabled.

\n" +" \n" +"
IP Lock
\n" +"

When enabled, the worker can only connect from the specified IP " +"address.

\n" +" \n" +"
Location Information
\n" +"

Optional location details for this worker (country, city, " +"hostname).

\n" +" " +msgstr "" + +#: cluster/views.py:99 templates/cluster/list_buttons.html:3 +msgid "Cluster Settings" +msgstr "Cluster-Einstellungen" + +#: cluster/views.py:105 +msgid "Cluster settings updated successfully." +msgstr "Cluster-Einstellungen erfolgreich aktualisiert." + +#: cluster/views.py:112 +msgid "" +"\n" +"
Cluster Mode
\n" +"

Configure how the cluster operates and synchronizes " +"configurations between nodes.

\n" +" \n" +"
Sync Intervals
\n" +"

Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.

\n" +" \n" +"
Restart Mode
\n" +"

Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"

\n" +" \n" +"
Worker Display
\n" +"

Select how workers should be identified in the interface - by " +"name, server address, location, or a combination.

\n" +" " +msgstr "" + #: console/views.py:25 console/views.py:57 user_manager/forms.py:16 msgid "Console" msgstr "Konsole" @@ -66,64 +268,14 @@ msgstr "Primärer DNS" msgid "Secondary DNS" msgstr "Sekundärer DNS" -#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 -#: templates/firewall/manage_firewall_rule.html:380 -#: templates/firewall/manage_firewall_settings.html:60 -#: templates/firewall/manage_redirect_rule.html:85 -#: templates/wireguard/wireguard_manage_ip.html:42 -#: templates/wireguard/wireguard_manage_peer.html:170 -#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 -#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 -msgid "Back" -msgstr "Zurück" - #: dns/forms.py:29 msgid "Resolver Settings" msgstr "Resolver‑Einstellungen" -#: dns/forms.py:37 dns/forms.py:83 dns/forms.py:134 -#: templates/firewall/manage_firewall_rule.html:379 -#: templates/firewall/manage_firewall_settings.html:59 -#: templates/firewall/manage_redirect_rule.html:84 -#: templates/wireguard/wireguard_manage_ip.html:41 -#: templates/wireguard/wireguard_manage_peer.html:168 -#: templates/wireguard/wireguard_manage_server.html:130 -#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 -#: vpn_invite/forms.py:325 -msgid "Save" -msgstr "Speichern" - -#: dns/forms.py:65 templates/dns/static_host_list.html:17 -msgid "Hostname" -msgstr "Hostname" - -#: dns/forms.py:66 templates/dns/static_host_list.html:18 -#: templates/firewall/manage_redirect_rule.html:43 -#: templates/firewall/manage_redirect_rule.html:67 -#: templates/firewall/manage_redirect_rule.html:68 -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "IP‑Adresse" - -#: dns/forms.py:68 dns/forms.py:110 -#: templates/firewall/manage_firewall_rule.html:382 -#: templates/firewall/manage_redirect_rule.html:86 -#: templates/wireguard/wireguard_manage_ip.html:43 -#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 -#: user_manager/forms.py:181 -msgid "Delete" -msgstr "Löschen" - #: dns/forms.py:75 msgid "Static DNS" msgstr "Statischer DNS" -#: dns/forms.py:111 templates/dns/static_host_list.html:68 -#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 -#: wireguard_peer/forms.py:10 -msgid "Name" -msgstr "Name" - #: dns/forms.py:112 firewall/forms.py:111 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -474,10 +626,6 @@ msgstr "" "Wenn dir bei der Übersetzung Fehler auffallen oder du eine neue Sprache " "anfordern möchtest, öffne bitte ein" -#: templates/access_denied.html:9 -msgid "Access Denied" -msgstr "Zugriff verweigert" - #: templates/access_denied.html:12 msgid "Sorry, you do not have permission to access this page." msgstr "Sie haben leider keine Berechtigung, diese Seite aufzurufen." @@ -511,9 +659,10 @@ msgstr "Sie wurden erfolgreich abgemeldet." msgid "Login again" msgstr "Erneut anmelden" -#: templates/base.html:112 templates/dns/static_host_list.html:72 -#: vpn_invite/forms.py:78 vpn_invite/forms.py:79 vpn_invite/forms.py:80 -#: vpn_invite/forms.py:81 vpn_invite/forms.py:82 +#: templates/base.html:112 templates/cluster/workers_list.html:9 +#: templates/dns/static_host_list.html:72 vpn_invite/forms.py:78 +#: vpn_invite/forms.py:79 vpn_invite/forms.py:80 vpn_invite/forms.py:81 +#: vpn_invite/forms.py:82 msgid "Status" msgstr "Status" @@ -526,11 +675,11 @@ msgstr "Benutzerverwaltung" msgid "VPN Invite" msgstr "VPN‑Einladung" -#: templates/base.html:254 +#: templates/base.html:263 msgid "Update Required" msgstr "Aktualisierung erforderlich" -#: templates/base.html:256 +#: templates/base.html:265 msgid "" "Your WireGuard settings have been modified. To apply these changes, please " "update the configuration and reload the WireGuard service." @@ -538,22 +687,78 @@ msgstr "" "Ihre WireGuard‑Einstellungen wurden geändert. Um die Änderungen anzuwenden, " "aktualisieren Sie die Konfiguration und laden Sie den WireGuard‑Dienst neu." -#: templates/base.html:265 +#: templates/base.html:274 msgid "Update and restart service" msgstr "Aktualisieren und Dienst neu starten" -#: templates/base.html:273 +#: templates/base.html:282 msgid "Update and reload service" msgstr "Aktualisieren und Dienst neu laden" -#: templates/base.html:286 +#: templates/base.html:295 msgid "Update Available" msgstr "Aktualisierung verfügbar" -#: templates/base.html:288 +#: templates/base.html:297 msgid "Version" msgstr "Version" +#: templates/cluster/workers_list.html:11 +msgid "Location" +msgstr "Standort" + +#: templates/cluster/workers_list.html:12 +msgid "Last Seen" +msgstr "Zuletzt gesehen" + +#: templates/cluster/workers_list.html:13 +msgid "Config Version" +msgstr "Konfigurationsversion" + +#: templates/cluster/workers_list.html:14 +msgid "Options" +msgstr "Optionen" + +#: templates/cluster/workers_list.html:26 vpn_invite/forms.py:49 +msgid "Disabled" +msgstr "Deaktiviert" + +#: templates/cluster/workers_list.html:33 +msgid "IP Lock Enabled" +msgstr "IP-Sperre aktiviert" + +#: templates/cluster/workers_list.html:36 +#: templates/cluster/workers_list.html:43 +msgid "Not set" +msgstr "Nicht gesetzt" + +#: templates/cluster/workers_list.html:50 +msgid "Never" +msgstr "" + +#: templates/cluster/workers_list.html:57 +msgid "Config Pending" +msgstr "Konfiguration ausstehend" + +#: templates/cluster/workers_list.html:65 +msgid "Force Reload" +msgstr "" + +#: templates/cluster/workers_list.html:70 +msgid "Force Restart" +msgstr "" + +#: templates/cluster/workers_list.html:74 +#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 +#: templates/user_manager/peer_group_list.html:35 +#: templates/wireguard/wireguard_peer_list.html:196 +msgid "Edit" +msgstr "Bearbeiten" + +#: templates/cluster/workers_list.html:79 +msgid "No workers configured" +msgstr "" + #: templates/console/console.html:12 msgid "Clear" msgstr "Leeren" @@ -594,12 +799,6 @@ msgstr "Letzte Aktualisierung" msgid "Update" msgstr "Aktualisieren" -#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 -#: templates/user_manager/peer_group_list.html:35 -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Bearbeiten" - #: templates/dns/static_host_list.html:116 msgid "Add Filter List" msgstr "Filterliste hinzufügen" @@ -1278,7 +1477,8 @@ msgid "" "key manually in your client before using it." msgstr "" "Diese Konfiguration enthält keinen privaten Schlüssel. Sie müssen den " -"privaten Schlüssel manuell in Ihrem Client hinzufügen, bevor Sie ihn verwenden." +"privaten Schlüssel manuell in Ihrem Client hinzufügen, bevor Sie ihn " +"verwenden." #: templates/wireguard/wireguard_peer_list.html:590 msgid "" @@ -1590,14 +1790,6 @@ msgstr "" msgid "Please type the username to proceed." msgstr "Bitte geben Sie den Benutzernamen ein, um fortzufahren." -#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 -msgid "Enabled" -msgstr "Aktiviert" - -#: vpn_invite/forms.py:49 -msgid "Disabled" -msgstr "Deaktiviert" - #: vpn_invite/forms.py:68 vpn_invite/forms.py:69 vpn_invite/forms.py:70 #: vpn_invite/forms.py:71 vpn_invite/forms.py:72 msgid "URL" diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index c1e25e8..0b4392c 100644 Binary files a/locale/es/LC_MESSAGES/django.mo and b/locale/es/LC_MESSAGES/django.mo differ diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index ced9c9f..3b1810b 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-12 11:30-0300\n" +"POT-Creation-Date: 2025-08-14 22:07-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,206 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: cluster/forms.py:17 dns/forms.py:111 templates/cluster/workers_list.html:8 +#: templates/dns/static_host_list.html:68 +#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 +#: wireguard_peer/forms.py:10 +msgid "Name" +msgstr "Nombre" + +#: cluster/forms.py:18 templates/cluster/workers_list.html:24 +#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 +msgid "Enabled" +msgstr "Habilitado" + +#: cluster/forms.py:19 +msgid "IP Lock" +msgstr "" + +#: cluster/forms.py:20 dns/forms.py:66 templates/cluster/workers_list.html:10 +#: templates/dns/static_host_list.html:18 +#: templates/firewall/manage_redirect_rule.html:43 +#: templates/firewall/manage_redirect_rule.html:67 +#: templates/firewall/manage_redirect_rule.html:68 +#: templates/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "Dirección IP" + +#: cluster/forms.py:21 +msgid "Country" +msgstr "" + +#: cluster/forms.py:22 +msgid "City" +msgstr "" + +#: cluster/forms.py:23 dns/forms.py:65 templates/dns/static_host_list.html:17 +msgid "Hostname" +msgstr "Nombre de host" + +#: cluster/forms.py:25 cluster/forms.py:95 dns/forms.py:25 dns/forms.py:67 +#: dns/forms.py:109 templates/firewall/manage_firewall_rule.html:380 +#: templates/firewall/manage_firewall_settings.html:60 +#: templates/firewall/manage_redirect_rule.html:85 +#: templates/wireguard/wireguard_manage_ip.html:42 +#: templates/wireguard/wireguard_manage_peer.html:170 +#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 +#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 +msgid "Back" +msgstr "Volver" + +#: cluster/forms.py:26 dns/forms.py:68 dns/forms.py:110 +#: templates/firewall/manage_firewall_rule.html:382 +#: templates/firewall/manage_redirect_rule.html:86 +#: templates/wireguard/wireguard_manage_ip.html:43 +#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 +#: user_manager/forms.py:181 +msgid "Delete" +msgstr "Eliminar" + +#: cluster/forms.py:54 cluster/forms.py:121 dns/forms.py:37 dns/forms.py:83 +#: dns/forms.py:134 templates/firewall/manage_firewall_rule.html:379 +#: templates/firewall/manage_firewall_settings.html:59 +#: templates/firewall/manage_redirect_rule.html:84 +#: templates/wireguard/wireguard_manage_ip.html:41 +#: templates/wireguard/wireguard_manage_peer.html:168 +#: templates/wireguard/wireguard_manage_server.html:130 +#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 +#: vpn_invite/forms.py:325 +msgid "Save" +msgstr "Guardar" + +#: cluster/forms.py:69 +msgid "A worker with that name already exists." +msgstr "Ya existe un worker con ese nombre." + +#: cluster/forms.py:72 +msgid "IP Address is required when IP Lock is enabled." +msgstr "" + +#: cluster/forms.py:87 +msgid "Cluster Enabled" +msgstr "Cluster habilitado" + +#: cluster/forms.py:88 +msgid "Primary Enable WireGuard" +msgstr "" + +#: cluster/forms.py:89 +msgid "Stats Sync Interval (seconds)" +msgstr "" + +#: cluster/forms.py:90 +msgid "Stats Cache Interval (seconds)" +msgstr "" + +#: cluster/forms.py:91 +msgid "Cluster Mode" +msgstr "" + +#: cluster/forms.py:92 +msgid "Restart Mode" +msgstr "Modo de reinicio" + +#: cluster/forms.py:93 +msgid "Worker Display" +msgstr "" + +#: cluster/forms.py:134 +msgid "Stats sync interval must be at least 10 seconds." +msgstr "El intervalo de sincronización de estadísticas debe ser de al menos 10 segundos." + +#: cluster/forms.py:137 +msgid "Stats cache interval must be at least 10 seconds." +msgstr "El intervalo de caché de estadísticas debe ser de al menos 10 segundos." + +#: cluster/views.py:15 cluster/views.py:27 cluster/views.py:96 +#: templates/access_denied.html:9 +msgid "Access Denied" +msgstr "Acceso denegado" + +#: cluster/views.py:17 templates/base.html:185 +msgid "Cluster" +msgstr "" + +#: cluster/views.py:33 +msgid "Edit Worker: " +msgstr "Editar Worker: " + +#: cluster/views.py:39 +msgid "Worker deleted|Worker deleted: " +msgstr "Worker eliminado|Worker eliminado: " + +#: cluster/views.py:42 +msgid "Worker not deleted|Invalid confirmation." +msgstr "Worker no eliminado|Confirmación inválida." + +#: cluster/views.py:46 templates/cluster/list_buttons.html:2 +msgid "Add Worker" +msgstr "Agregar Worker" + +#: cluster/views.py:57 +msgid "Worker updated|Worker updated: " +msgstr "Worker actualizado|Worker actualizado: " + +#: cluster/views.py:59 +msgid "Worker created|Worker created: " +msgstr "Worker creado|Worker creado: " + +#: cluster/views.py:64 +msgid "" +"\n" +"
Worker Configuration
\n" +"

Configure a cluster worker node that will synchronize with this " +"primary instance.

\n" +" \n" +"
Name
\n" +"

A unique name to identify this worker.

\n" +" \n" +"
IP Address
\n" +"

The IP address of the worker node. Leave empty if IP lock is " +"disabled.

\n" +" \n" +"
IP Lock
\n" +"

When enabled, the worker can only connect from the specified IP " +"address.

\n" +" \n" +"
Location Information
\n" +"

Optional location details for this worker (country, city, " +"hostname).

\n" +" " +msgstr "" + +#: cluster/views.py:99 templates/cluster/list_buttons.html:3 +msgid "Cluster Settings" +msgstr "Configuración del Cluster" + +#: cluster/views.py:105 +msgid "Cluster settings updated successfully." +msgstr "Configuración del cluster actualizada exitosamente." + +#: cluster/views.py:112 +msgid "" +"\n" +"
Cluster Mode
\n" +"

Configure how the cluster operates and synchronizes " +"configurations between nodes.

\n" +" \n" +"
Sync Intervals
\n" +"

Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.

\n" +" \n" +"
Restart Mode
\n" +"

Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"

\n" +" \n" +"
Worker Display
\n" +"

Select how workers should be identified in the interface - by " +"name, server address, location, or a combination.

\n" +" " +msgstr "" + #: console/views.py:25 console/views.py:57 user_manager/forms.py:16 msgid "Console" msgstr "Consola" @@ -65,64 +265,14 @@ msgstr "DNS primario" msgid "Secondary DNS" msgstr "DNS secundario" -#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 -#: templates/firewall/manage_firewall_rule.html:380 -#: templates/firewall/manage_firewall_settings.html:60 -#: templates/firewall/manage_redirect_rule.html:85 -#: templates/wireguard/wireguard_manage_ip.html:42 -#: templates/wireguard/wireguard_manage_peer.html:170 -#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 -#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 -msgid "Back" -msgstr "Volver" - #: dns/forms.py:29 msgid "Resolver Settings" msgstr "Configuración de resolución" -#: dns/forms.py:37 dns/forms.py:83 dns/forms.py:134 -#: templates/firewall/manage_firewall_rule.html:379 -#: templates/firewall/manage_firewall_settings.html:59 -#: templates/firewall/manage_redirect_rule.html:84 -#: templates/wireguard/wireguard_manage_ip.html:41 -#: templates/wireguard/wireguard_manage_peer.html:168 -#: templates/wireguard/wireguard_manage_server.html:130 -#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 -#: vpn_invite/forms.py:325 -msgid "Save" -msgstr "Guardar" - -#: dns/forms.py:65 templates/dns/static_host_list.html:17 -msgid "Hostname" -msgstr "Nombre de host" - -#: dns/forms.py:66 templates/dns/static_host_list.html:18 -#: templates/firewall/manage_redirect_rule.html:43 -#: templates/firewall/manage_redirect_rule.html:67 -#: templates/firewall/manage_redirect_rule.html:68 -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "Dirección IP" - -#: dns/forms.py:68 dns/forms.py:110 -#: templates/firewall/manage_firewall_rule.html:382 -#: templates/firewall/manage_redirect_rule.html:86 -#: templates/wireguard/wireguard_manage_ip.html:43 -#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 -#: user_manager/forms.py:181 -msgid "Delete" -msgstr "Eliminar" - #: dns/forms.py:75 msgid "Static DNS" msgstr "DNS estático" -#: dns/forms.py:111 templates/dns/static_host_list.html:68 -#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 -#: wireguard_peer/forms.py:10 -msgid "Name" -msgstr "Nombre" - #: dns/forms.py:112 firewall/forms.py:111 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -470,10 +620,6 @@ msgstr "" "Si encuentra algún problema con la traducción o desea solicitar un nuevo " "idioma, por favor abra un" -#: templates/access_denied.html:9 -msgid "Access Denied" -msgstr "Acceso denegado" - #: templates/access_denied.html:12 msgid "Sorry, you do not have permission to access this page." msgstr "Lo siento, no tienes permiso para acceder a esta página." @@ -508,9 +654,10 @@ msgstr "Has cerrado sesión correctamente." msgid "Login again" msgstr "Iniciar sesión de nuevo" -#: templates/base.html:112 templates/dns/static_host_list.html:72 -#: vpn_invite/forms.py:78 vpn_invite/forms.py:79 vpn_invite/forms.py:80 -#: vpn_invite/forms.py:81 vpn_invite/forms.py:82 +#: templates/base.html:112 templates/cluster/workers_list.html:9 +#: templates/dns/static_host_list.html:72 vpn_invite/forms.py:78 +#: vpn_invite/forms.py:79 vpn_invite/forms.py:80 vpn_invite/forms.py:81 +#: vpn_invite/forms.py:82 msgid "Status" msgstr "Estado" @@ -523,11 +670,11 @@ msgstr "Gestión de usuarios" msgid "VPN Invite" msgstr "Invitación VPN" -#: templates/base.html:254 +#: templates/base.html:263 msgid "Update Required" msgstr "Actualización requerida" -#: templates/base.html:256 +#: templates/base.html:265 msgid "" "Your WireGuard settings have been modified. To apply these changes, please " "update the configuration and reload the WireGuard service." @@ -535,22 +682,78 @@ msgstr "" "Tus ajustes de WireGuard han sido modificados. Para aplicar los cambios, " "actualiza la configuración y recarga el servicio WireGuard." -#: templates/base.html:265 +#: templates/base.html:274 msgid "Update and restart service" msgstr "Actualizar y reiniciar servicio" -#: templates/base.html:273 +#: templates/base.html:282 msgid "Update and reload service" msgstr "Actualizar y recargar servicio" -#: templates/base.html:286 +#: templates/base.html:295 msgid "Update Available" msgstr "Actualización disponible" -#: templates/base.html:288 +#: templates/base.html:297 msgid "Version" msgstr "Versión" +#: templates/cluster/workers_list.html:11 +msgid "Location" +msgstr "Ubicación" + +#: templates/cluster/workers_list.html:12 +msgid "Last Seen" +msgstr "Visto por última vez" + +#: templates/cluster/workers_list.html:13 +msgid "Config Version" +msgstr "Versión de configuración" + +#: templates/cluster/workers_list.html:14 +msgid "Options" +msgstr "Opciones" + +#: templates/cluster/workers_list.html:26 vpn_invite/forms.py:49 +msgid "Disabled" +msgstr "Deshabilitado" + +#: templates/cluster/workers_list.html:33 +msgid "IP Lock Enabled" +msgstr "Bloqueo de IP habilitado" + +#: templates/cluster/workers_list.html:36 +#: templates/cluster/workers_list.html:43 +msgid "Not set" +msgstr "No establecido" + +#: templates/cluster/workers_list.html:50 +msgid "Never" +msgstr "" + +#: templates/cluster/workers_list.html:57 +msgid "Config Pending" +msgstr "Configuración pendiente" + +#: templates/cluster/workers_list.html:65 +msgid "Force Reload" +msgstr "" + +#: templates/cluster/workers_list.html:70 +msgid "Force Restart" +msgstr "" + +#: templates/cluster/workers_list.html:74 +#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 +#: templates/user_manager/peer_group_list.html:35 +#: templates/wireguard/wireguard_peer_list.html:196 +msgid "Edit" +msgstr "Editar" + +#: templates/cluster/workers_list.html:79 +msgid "No workers configured" +msgstr "" + #: templates/console/console.html:12 msgid "Clear" msgstr "Limpiar" @@ -591,12 +794,6 @@ msgstr "Última actualización" msgid "Update" msgstr "Actualizar" -#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 -#: templates/user_manager/peer_group_list.html:35 -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Editar" - #: templates/dns/static_host_list.html:116 msgid "Add Filter List" msgstr "Añadir lista de filtro" @@ -1575,14 +1772,6 @@ msgstr "" msgid "Please type the username to proceed." msgstr "Por favor escribe el nombre de usuario para continuar." -#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 -msgid "Enabled" -msgstr "Habilitado" - -#: vpn_invite/forms.py:49 -msgid "Disabled" -msgstr "Deshabilitado" - #: vpn_invite/forms.py:68 vpn_invite/forms.py:69 vpn_invite/forms.py:70 #: vpn_invite/forms.py:71 vpn_invite/forms.py:72 msgid "URL" diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index 089bf98..bf597c7 100644 Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index f7216a4..7813c50 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-12 11:30-0300\n" +"POT-Creation-Date: 2025-08-14 22:07-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,210 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: cluster/forms.py:17 dns/forms.py:111 templates/cluster/workers_list.html:8 +#: templates/dns/static_host_list.html:68 +#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 +#: wireguard_peer/forms.py:10 +msgid "Name" +msgstr "Nom" + +#: cluster/forms.py:18 templates/cluster/workers_list.html:24 +#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 +msgid "Enabled" +msgstr "Activé" + +#: cluster/forms.py:19 +msgid "IP Lock" +msgstr "" + +#: cluster/forms.py:20 dns/forms.py:66 templates/cluster/workers_list.html:10 +#: templates/dns/static_host_list.html:18 +#: templates/firewall/manage_redirect_rule.html:43 +#: templates/firewall/manage_redirect_rule.html:67 +#: templates/firewall/manage_redirect_rule.html:68 +#: templates/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "Adresse IP" + +#: cluster/forms.py:21 +msgid "Country" +msgstr "" + +#: cluster/forms.py:22 +msgid "City" +msgstr "" + +#: cluster/forms.py:23 dns/forms.py:65 templates/dns/static_host_list.html:17 +msgid "Hostname" +msgstr "Nom d’hôte" + +#: cluster/forms.py:25 cluster/forms.py:95 dns/forms.py:25 dns/forms.py:67 +#: dns/forms.py:109 templates/firewall/manage_firewall_rule.html:380 +#: templates/firewall/manage_firewall_settings.html:60 +#: templates/firewall/manage_redirect_rule.html:85 +#: templates/wireguard/wireguard_manage_ip.html:42 +#: templates/wireguard/wireguard_manage_peer.html:170 +#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 +#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 +msgid "Back" +msgstr "Retour" + +#: cluster/forms.py:26 dns/forms.py:68 dns/forms.py:110 +#: templates/firewall/manage_firewall_rule.html:382 +#: templates/firewall/manage_redirect_rule.html:86 +#: templates/wireguard/wireguard_manage_ip.html:43 +#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 +#: user_manager/forms.py:181 +msgid "Delete" +msgstr "Supprimer" + +#: cluster/forms.py:54 cluster/forms.py:121 dns/forms.py:37 dns/forms.py:83 +#: dns/forms.py:134 templates/firewall/manage_firewall_rule.html:379 +#: templates/firewall/manage_firewall_settings.html:59 +#: templates/firewall/manage_redirect_rule.html:84 +#: templates/wireguard/wireguard_manage_ip.html:41 +#: templates/wireguard/wireguard_manage_peer.html:168 +#: templates/wireguard/wireguard_manage_server.html:130 +#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 +#: vpn_invite/forms.py:325 +msgid "Save" +msgstr "Enregistrer" + +#: cluster/forms.py:69 +msgid "A worker with that name already exists." +msgstr "Un worker avec ce nom existe déjà." + +#: cluster/forms.py:72 +msgid "IP Address is required when IP Lock is enabled." +msgstr "" + +#: cluster/forms.py:87 +msgid "Cluster Enabled" +msgstr "Cluster activé" + +#: cluster/forms.py:88 +msgid "Primary Enable WireGuard" +msgstr "" + +#: cluster/forms.py:89 +msgid "Stats Sync Interval (seconds)" +msgstr "" + +#: cluster/forms.py:90 +msgid "Stats Cache Interval (seconds)" +msgstr "" + +#: cluster/forms.py:91 +msgid "Cluster Mode" +msgstr "" + +#: cluster/forms.py:92 +msgid "Restart Mode" +msgstr "Mode de redémarrage" + +#: cluster/forms.py:93 +msgid "Worker Display" +msgstr "" + +#: cluster/forms.py:134 +msgid "Stats sync interval must be at least 10 seconds." +msgstr "L'intervalle de synchronisation des statistiques doit être d'au moins 10 secondes." +"L’intervalle d’actualisation de la liste des peers doit être d’au moins 5 " +"secondes." + +#: cluster/forms.py:137 +msgid "Stats cache interval must be at least 10 seconds." +msgstr "L'intervalle de cache des statistiques doit être d'au moins 10 secondes." +"L’intervalle d’actualisation de la liste des peers doit être d’au moins 5 " +"secondes." + +#: cluster/views.py:15 cluster/views.py:27 cluster/views.py:96 +#: templates/access_denied.html:9 +msgid "Access Denied" +msgstr "Accès refusé" + +#: cluster/views.py:17 templates/base.html:185 +msgid "Cluster" +msgstr "" + +#: cluster/views.py:33 +msgid "Edit Worker: " +msgstr "Modifier Worker : " + +#: cluster/views.py:39 +msgid "Worker deleted|Worker deleted: " +msgstr "Worker supprimé|Worker supprimé : " + +#: cluster/views.py:42 +msgid "Worker not deleted|Invalid confirmation." +msgstr "Worker non supprimé|Confirmation invalide." + +#: cluster/views.py:46 templates/cluster/list_buttons.html:2 +msgid "Add Worker" +msgstr "Ajouter Worker" + +#: cluster/views.py:57 +msgid "Worker updated|Worker updated: " +msgstr "Worker mis à jour|Worker mis à jour : " + +#: cluster/views.py:59 +msgid "Worker created|Worker created: " +msgstr "Worker créé|Worker créé : " + +#: cluster/views.py:64 +msgid "" +"\n" +"
Worker Configuration
\n" +"

Configure a cluster worker node that will synchronize with this " +"primary instance.

\n" +" \n" +"
Name
\n" +"

A unique name to identify this worker.

\n" +" \n" +"
IP Address
\n" +"

The IP address of the worker node. Leave empty if IP lock is " +"disabled.

\n" +" \n" +"
IP Lock
\n" +"

When enabled, the worker can only connect from the specified IP " +"address.

\n" +" \n" +"
Location Information
\n" +"

Optional location details for this worker (country, city, " +"hostname).

\n" +" " +msgstr "" + +#: cluster/views.py:99 templates/cluster/list_buttons.html:3 +msgid "Cluster Settings" +msgstr "Paramètres du Cluster" + +#: cluster/views.py:105 +msgid "Cluster settings updated successfully." +msgstr "Paramètres du cluster mis à jour avec succès." + +#: cluster/views.py:112 +msgid "" +"\n" +"
Cluster Mode
\n" +"

Configure how the cluster operates and synchronizes " +"configurations between nodes.

\n" +" \n" +"
Sync Intervals
\n" +"

Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.

\n" +" \n" +"
Restart Mode
\n" +"

Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"

\n" +" \n" +"
Worker Display
\n" +"

Select how workers should be identified in the interface - by " +"name, server address, location, or a combination.

\n" +" " +msgstr "" + #: console/views.py:25 console/views.py:57 user_manager/forms.py:16 msgid "Console" msgstr "Console" @@ -65,64 +269,14 @@ msgstr "DNS primaire" msgid "Secondary DNS" msgstr "DNS secondaire" -#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 -#: templates/firewall/manage_firewall_rule.html:380 -#: templates/firewall/manage_firewall_settings.html:60 -#: templates/firewall/manage_redirect_rule.html:85 -#: templates/wireguard/wireguard_manage_ip.html:42 -#: templates/wireguard/wireguard_manage_peer.html:170 -#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 -#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 -msgid "Back" -msgstr "Retour" - #: dns/forms.py:29 msgid "Resolver Settings" msgstr "Paramètres du résolveur" -#: dns/forms.py:37 dns/forms.py:83 dns/forms.py:134 -#: templates/firewall/manage_firewall_rule.html:379 -#: templates/firewall/manage_firewall_settings.html:59 -#: templates/firewall/manage_redirect_rule.html:84 -#: templates/wireguard/wireguard_manage_ip.html:41 -#: templates/wireguard/wireguard_manage_peer.html:168 -#: templates/wireguard/wireguard_manage_server.html:130 -#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 -#: vpn_invite/forms.py:325 -msgid "Save" -msgstr "Enregistrer" - -#: dns/forms.py:65 templates/dns/static_host_list.html:17 -msgid "Hostname" -msgstr "Nom d’hôte" - -#: dns/forms.py:66 templates/dns/static_host_list.html:18 -#: templates/firewall/manage_redirect_rule.html:43 -#: templates/firewall/manage_redirect_rule.html:67 -#: templates/firewall/manage_redirect_rule.html:68 -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "Adresse IP" - -#: dns/forms.py:68 dns/forms.py:110 -#: templates/firewall/manage_firewall_rule.html:382 -#: templates/firewall/manage_redirect_rule.html:86 -#: templates/wireguard/wireguard_manage_ip.html:43 -#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 -#: user_manager/forms.py:181 -msgid "Delete" -msgstr "Supprimer" - #: dns/forms.py:75 msgid "Static DNS" msgstr "DNS statique" -#: dns/forms.py:111 templates/dns/static_host_list.html:68 -#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 -#: wireguard_peer/forms.py:10 -msgid "Name" -msgstr "Nom" - #: dns/forms.py:112 firewall/forms.py:111 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -472,10 +626,6 @@ msgstr "" "Si vous constatez un problème dans la traduction ou souhaitez demander une " "nouvelle langue, veuillez ouvrir une" -#: templates/access_denied.html:9 -msgid "Access Denied" -msgstr "Accès refusé" - #: templates/access_denied.html:12 msgid "Sorry, you do not have permission to access this page." msgstr "Désolé, vous n’avez pas l’autorisation d’accéder à cette page." @@ -510,9 +660,10 @@ msgstr "Vous avez été déconnecté avec succès." msgid "Login again" msgstr "Se reconnecter" -#: templates/base.html:112 templates/dns/static_host_list.html:72 -#: vpn_invite/forms.py:78 vpn_invite/forms.py:79 vpn_invite/forms.py:80 -#: vpn_invite/forms.py:81 vpn_invite/forms.py:82 +#: templates/base.html:112 templates/cluster/workers_list.html:9 +#: templates/dns/static_host_list.html:72 vpn_invite/forms.py:78 +#: vpn_invite/forms.py:79 vpn_invite/forms.py:80 vpn_invite/forms.py:81 +#: vpn_invite/forms.py:82 msgid "Status" msgstr "Statut" @@ -525,11 +676,11 @@ msgstr "Gestion des utilisateurs" msgid "VPN Invite" msgstr "Invitation VPN" -#: templates/base.html:254 +#: templates/base.html:263 msgid "Update Required" msgstr "Mise à jour requise" -#: templates/base.html:256 +#: templates/base.html:265 msgid "" "Your WireGuard settings have been modified. To apply these changes, please " "update the configuration and reload the WireGuard service." @@ -537,22 +688,78 @@ msgstr "" "Les paramètres WireGuard ont été modifiés. Pour appliquer ces changements, " "mettez à jour la configuration et rechargez le service WireGuard." -#: templates/base.html:265 +#: templates/base.html:274 msgid "Update and restart service" msgstr "Mettre à jour et redémarrer le service" -#: templates/base.html:273 +#: templates/base.html:282 msgid "Update and reload service" msgstr "Mettre à jour et recharger le service" -#: templates/base.html:286 +#: templates/base.html:295 msgid "Update Available" msgstr "Mise à jour disponible" -#: templates/base.html:288 +#: templates/base.html:297 msgid "Version" msgstr "Version" +#: templates/cluster/workers_list.html:11 +msgid "Location" +msgstr "Emplacement" + +#: templates/cluster/workers_list.html:12 +msgid "Last Seen" +msgstr "Dernière connexion" + +#: templates/cluster/workers_list.html:13 +msgid "Config Version" +msgstr "Version de configuration" + +#: templates/cluster/workers_list.html:14 +msgid "Options" +msgstr "Options" + +#: templates/cluster/workers_list.html:26 vpn_invite/forms.py:49 +msgid "Disabled" +msgstr "Désactivé" + +#: templates/cluster/workers_list.html:33 +msgid "IP Lock Enabled" +msgstr "Verrouillage IP activé" + +#: templates/cluster/workers_list.html:36 +#: templates/cluster/workers_list.html:43 +msgid "Not set" +msgstr "Non défini" + +#: templates/cluster/workers_list.html:50 +msgid "Never" +msgstr "" + +#: templates/cluster/workers_list.html:57 +msgid "Config Pending" +msgstr "Configuration en attente" + +#: templates/cluster/workers_list.html:65 +msgid "Force Reload" +msgstr "" + +#: templates/cluster/workers_list.html:70 +msgid "Force Restart" +msgstr "" + +#: templates/cluster/workers_list.html:74 +#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 +#: templates/user_manager/peer_group_list.html:35 +#: templates/wireguard/wireguard_peer_list.html:196 +msgid "Edit" +msgstr "Modifier" + +#: templates/cluster/workers_list.html:79 +msgid "No workers configured" +msgstr "" + #: templates/console/console.html:12 msgid "Clear" msgstr "Effacer" @@ -593,12 +800,6 @@ msgstr "Dernière mise à jour" msgid "Update" msgstr "Mettre à jour" -#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 -#: templates/user_manager/peer_group_list.html:35 -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Modifier" - #: templates/dns/static_host_list.html:116 msgid "Add Filter List" msgstr "Ajouter une liste de filtres" @@ -1273,8 +1474,8 @@ msgid "" "This configuration does not contain a private key. You must add the private " "key manually in your client before using it." msgstr "" -"Cette configuration ne contient pas de clé privée. Vous devez ajouter la " -"clé privée manuellement dans votre client avant de l'utiliser." +"Cette configuration ne contient pas de clé privée. Vous devez ajouter la clé " +"privée manuellement dans votre client avant de l'utiliser." #: templates/wireguard/wireguard_peer_list.html:590 msgid "" @@ -1582,14 +1783,6 @@ msgstr "" msgid "Please type the username to proceed." msgstr "Veuillez saisir le nom d’utilisateur pour continuer." -#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 -msgid "Enabled" -msgstr "Activé" - -#: vpn_invite/forms.py:49 -msgid "Disabled" -msgstr "Désactivé" - #: vpn_invite/forms.py:68 vpn_invite/forms.py:69 vpn_invite/forms.py:70 #: vpn_invite/forms.py:71 vpn_invite/forms.py:72 msgid "URL" diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index 79df9ef..68ebbec 100644 Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index cf2f0d1..9bc114f 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-12 11:30-0300\n" +"POT-Creation-Date: 2025-08-14 22:07-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,206 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: cluster/forms.py:17 dns/forms.py:111 templates/cluster/workers_list.html:8 +#: templates/dns/static_host_list.html:68 +#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 +#: wireguard_peer/forms.py:10 +msgid "Name" +msgstr "Nome" + +#: cluster/forms.py:18 templates/cluster/workers_list.html:24 +#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 +msgid "Enabled" +msgstr "Habilitado" + +#: cluster/forms.py:19 +msgid "IP Lock" +msgstr "Bloqueio de IP" + +#: cluster/forms.py:20 dns/forms.py:66 templates/cluster/workers_list.html:10 +#: templates/dns/static_host_list.html:18 +#: templates/firewall/manage_redirect_rule.html:43 +#: templates/firewall/manage_redirect_rule.html:67 +#: templates/firewall/manage_redirect_rule.html:68 +#: templates/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "Endereço IP" + +#: cluster/forms.py:21 +msgid "Country" +msgstr "País" + +#: cluster/forms.py:22 +msgid "City" +msgstr "Cidade" + +#: cluster/forms.py:23 dns/forms.py:65 templates/dns/static_host_list.html:17 +msgid "Hostname" +msgstr "Endereço do Host" + +#: cluster/forms.py:25 cluster/forms.py:95 dns/forms.py:25 dns/forms.py:67 +#: dns/forms.py:109 templates/firewall/manage_firewall_rule.html:380 +#: templates/firewall/manage_firewall_settings.html:60 +#: templates/firewall/manage_redirect_rule.html:85 +#: templates/wireguard/wireguard_manage_ip.html:42 +#: templates/wireguard/wireguard_manage_peer.html:170 +#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 +#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 +msgid "Back" +msgstr "Voltar" + +#: cluster/forms.py:26 dns/forms.py:68 dns/forms.py:110 +#: templates/firewall/manage_firewall_rule.html:382 +#: templates/firewall/manage_redirect_rule.html:86 +#: templates/wireguard/wireguard_manage_ip.html:43 +#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 +#: user_manager/forms.py:181 +msgid "Delete" +msgstr "Excluir" + +#: cluster/forms.py:54 cluster/forms.py:121 dns/forms.py:37 dns/forms.py:83 +#: dns/forms.py:134 templates/firewall/manage_firewall_rule.html:379 +#: templates/firewall/manage_firewall_settings.html:59 +#: templates/firewall/manage_redirect_rule.html:84 +#: templates/wireguard/wireguard_manage_ip.html:41 +#: templates/wireguard/wireguard_manage_peer.html:168 +#: templates/wireguard/wireguard_manage_server.html:130 +#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 +#: vpn_invite/forms.py:325 +msgid "Save" +msgstr "Salvar" + +#: cluster/forms.py:69 +msgid "A worker with that name already exists." +msgstr "Um worker com esse nome já existe." + +#: cluster/forms.py:72 +msgid "IP Address is required when IP Lock is enabled." +msgstr "Endereço IP é obrigatório quando Bloqueio de IP está habilitado." + +#: cluster/forms.py:87 +msgid "Cluster Enabled" +msgstr "Cluster Habilitado" + +#: cluster/forms.py:88 +msgid "Primary Enable WireGuard" +msgstr "Habilitar WireGuard Principal" + +#: cluster/forms.py:89 +msgid "Stats Sync Interval (seconds)" +msgstr "Intervalo de Sincronização de Estatísticas (segundos)" + +#: cluster/forms.py:90 +msgid "Stats Cache Interval (seconds)" +msgstr "Intervalo de Cache de Estatísticas (segundos)" + +#: cluster/forms.py:91 +msgid "Cluster Mode" +msgstr "Modo do Cluster" + +#: cluster/forms.py:92 +msgid "Restart Mode" +msgstr "Modo de Reinicialização" + +#: cluster/forms.py:93 +msgid "Worker Display" +msgstr "Exibição do Worker" + +#: cluster/forms.py:134 +msgid "Stats sync interval must be at least 10 seconds." +msgstr "Intervalo de sincronização de estatísticas deve ser de pelo menos 10 segundos." + +#: cluster/forms.py:137 +msgid "Stats cache interval must be at least 10 seconds." +msgstr "Intervalo de cache de estatísticas deve ser de pelo menos 10 segundos." + +#: cluster/views.py:15 cluster/views.py:27 cluster/views.py:96 +#: templates/access_denied.html:9 +msgid "Access Denied" +msgstr "Acesso Negado" + +#: cluster/views.py:17 templates/base.html:185 +msgid "Cluster" +msgstr "Cluster" + +#: cluster/views.py:33 +msgid "Edit Worker: " +msgstr "Editar Worker: " + +#: cluster/views.py:39 +msgid "Worker deleted|Worker deleted: " +msgstr "Worker excluído|Worker excluído: " + +#: cluster/views.py:42 +msgid "Worker not deleted|Invalid confirmation." +msgstr "Worker não foi excluído|Confirmação inválida." + +#: cluster/views.py:46 templates/cluster/list_buttons.html:2 +msgid "Add Worker" +msgstr "Adicionar Worker" + +#: cluster/views.py:57 +msgid "Worker updated|Worker updated: " +msgstr "Worker atualizado|Worker atualizado: " + +#: cluster/views.py:59 +msgid "Worker created|Worker created: " +msgstr "Worker criado|Worker criado: " + +#: cluster/views.py:64 +msgid "" +"\n" +"
Worker Configuration
\n" +"

Configure a cluster worker node that will synchronize with this " +"primary instance.

\n" +" \n" +"
Name
\n" +"

A unique name to identify this worker.

\n" +" \n" +"
IP Address
\n" +"

The IP address of the worker node. Leave empty if IP lock is " +"disabled.

\n" +" \n" +"
IP Lock
\n" +"

When enabled, the worker can only connect from the specified IP " +"address.

\n" +" \n" +"
Location Information
\n" +"

Optional location details for this worker (country, city, " +"hostname).

\n" +" " +msgstr "" + +#: cluster/views.py:99 templates/cluster/list_buttons.html:3 +msgid "Cluster Settings" +msgstr "Configurações do Cluster" + +#: cluster/views.py:105 +msgid "Cluster settings updated successfully." +msgstr "Configurações do cluster atualizadas com sucesso." + +#: cluster/views.py:112 +msgid "" +"\n" +"
Cluster Mode
\n" +"

Configure how the cluster operates and synchronizes " +"configurations between nodes.

\n" +" \n" +"
Sync Intervals
\n" +"

Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.

\n" +" \n" +"
Restart Mode
\n" +"

Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"

\n" +" \n" +"
Worker Display
\n" +"

Select how workers should be identified in the interface - by " +"name, server address, location, or a combination.

\n" +" " +msgstr "" + #: console/views.py:25 console/views.py:57 user_manager/forms.py:16 msgid "Console" msgstr "Console" @@ -65,64 +265,14 @@ msgstr "DNS Primário" msgid "Secondary DNS" msgstr "DNS Secundário" -#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 -#: templates/firewall/manage_firewall_rule.html:380 -#: templates/firewall/manage_firewall_settings.html:60 -#: templates/firewall/manage_redirect_rule.html:85 -#: templates/wireguard/wireguard_manage_ip.html:42 -#: templates/wireguard/wireguard_manage_peer.html:170 -#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 -#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 -msgid "Back" -msgstr "Voltar" - #: dns/forms.py:29 msgid "Resolver Settings" msgstr "Resolução de DNS" -#: dns/forms.py:37 dns/forms.py:83 dns/forms.py:134 -#: templates/firewall/manage_firewall_rule.html:379 -#: templates/firewall/manage_firewall_settings.html:59 -#: templates/firewall/manage_redirect_rule.html:84 -#: templates/wireguard/wireguard_manage_ip.html:41 -#: templates/wireguard/wireguard_manage_peer.html:168 -#: templates/wireguard/wireguard_manage_server.html:130 -#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 -#: vpn_invite/forms.py:325 -msgid "Save" -msgstr "Salvar" - -#: dns/forms.py:65 templates/dns/static_host_list.html:17 -msgid "Hostname" -msgstr "Endereço do Host" - -#: dns/forms.py:66 templates/dns/static_host_list.html:18 -#: templates/firewall/manage_redirect_rule.html:43 -#: templates/firewall/manage_redirect_rule.html:67 -#: templates/firewall/manage_redirect_rule.html:68 -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "Endereço IP" - -#: dns/forms.py:68 dns/forms.py:110 -#: templates/firewall/manage_firewall_rule.html:382 -#: templates/firewall/manage_redirect_rule.html:86 -#: templates/wireguard/wireguard_manage_ip.html:43 -#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 -#: user_manager/forms.py:181 -msgid "Delete" -msgstr "Excluir" - #: dns/forms.py:75 msgid "Static DNS" msgstr "DNS Estático" -#: dns/forms.py:111 templates/dns/static_host_list.html:68 -#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 -#: wireguard_peer/forms.py:10 -msgid "Name" -msgstr "Nome" - #: dns/forms.py:112 firewall/forms.py:111 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -471,10 +621,6 @@ msgstr "" "Se encontrar algum problema na tradução ou quiser solicitar um novo idioma, " "por favor abra uma" -#: templates/access_denied.html:9 -msgid "Access Denied" -msgstr "Acesso Negado" - #: templates/access_denied.html:12 msgid "Sorry, you do not have permission to access this page." msgstr "Desculpe, você não tem permissão para acessar esta página." @@ -509,9 +655,10 @@ msgstr "Você foi desconectado com sucesso." msgid "Login again" msgstr "Acessar novamente" -#: templates/base.html:112 templates/dns/static_host_list.html:72 -#: vpn_invite/forms.py:78 vpn_invite/forms.py:79 vpn_invite/forms.py:80 -#: vpn_invite/forms.py:81 vpn_invite/forms.py:82 +#: templates/base.html:112 templates/cluster/workers_list.html:9 +#: templates/dns/static_host_list.html:72 vpn_invite/forms.py:78 +#: vpn_invite/forms.py:79 vpn_invite/forms.py:80 vpn_invite/forms.py:81 +#: vpn_invite/forms.py:82 msgid "Status" msgstr "Estado" @@ -524,11 +671,11 @@ msgstr "Configurar Usuários" msgid "VPN Invite" msgstr "Convite para VPN" -#: templates/base.html:254 +#: templates/base.html:263 msgid "Update Required" msgstr "Atualização Necessária" -#: templates/base.html:256 +#: templates/base.html:265 msgid "" "Your WireGuard settings have been modified. To apply these changes, please " "update the configuration and reload the WireGuard service." @@ -536,22 +683,78 @@ msgstr "" "Suas configurações do WireGuard foram modificadas. Para aplicar essas " "mudanças, atualize a configuração e recarregue o serviço WireGuard." -#: templates/base.html:265 +#: templates/base.html:274 msgid "Update and restart service" msgstr "Atualizar e reiniciar o serviço" -#: templates/base.html:273 +#: templates/base.html:282 msgid "Update and reload service" msgstr "Atualizar e recarregar o serviço" -#: templates/base.html:286 +#: templates/base.html:295 msgid "Update Available" msgstr "Atualização Disponível" -#: templates/base.html:288 +#: templates/base.html:297 msgid "Version" msgstr "Versão" +#: templates/cluster/workers_list.html:11 +msgid "Location" +msgstr "Localização" + +#: templates/cluster/workers_list.html:12 +msgid "Last Seen" +msgstr "Visto pela Última Vez" + +#: templates/cluster/workers_list.html:13 +msgid "Config Version" +msgstr "Versão da Configuração" + +#: templates/cluster/workers_list.html:14 +msgid "Options" +msgstr "Opções" + +#: templates/cluster/workers_list.html:26 vpn_invite/forms.py:49 +msgid "Disabled" +msgstr "Desabilitado" + +#: templates/cluster/workers_list.html:33 +msgid "IP Lock Enabled" +msgstr "Bloqueio de IP Habilitado" + +#: templates/cluster/workers_list.html:36 +#: templates/cluster/workers_list.html:43 +msgid "Not set" +msgstr "Não definido" + +#: templates/cluster/workers_list.html:50 +msgid "Never" +msgstr "Nunca" + +#: templates/cluster/workers_list.html:57 +msgid "Config Pending" +msgstr "Configuração Pendente" + +#: templates/cluster/workers_list.html:65 +msgid "Force Reload" +msgstr "Forçar Recarga" + +#: templates/cluster/workers_list.html:70 +msgid "Force Restart" +msgstr "Forçar Reinicialização" + +#: templates/cluster/workers_list.html:74 +#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 +#: templates/user_manager/peer_group_list.html:35 +#: templates/wireguard/wireguard_peer_list.html:196 +msgid "Edit" +msgstr "Editar" + +#: templates/cluster/workers_list.html:79 +msgid "No workers configured" +msgstr "" + #: templates/console/console.html:12 msgid "Clear" msgstr "Limpar" @@ -592,12 +795,6 @@ msgstr "Última Atualização" msgid "Update" msgstr "Atualizar" -#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 -#: templates/user_manager/peer_group_list.html:35 -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Editar" - #: templates/dns/static_host_list.html:116 msgid "Add Filter List" msgstr "Adicionar Lista de Filtro" @@ -1590,14 +1787,6 @@ msgstr "" msgid "Please type the username to proceed." msgstr "Por favor, digite o nome de usuário para prosseguir." -#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 -msgid "Enabled" -msgstr "Habilitado" - -#: vpn_invite/forms.py:49 -msgid "Disabled" -msgstr "Desabilitado" - #: vpn_invite/forms.py:68 vpn_invite/forms.py:69 vpn_invite/forms.py:70 #: vpn_invite/forms.py:71 vpn_invite/forms.py:72 msgid "URL" diff --git a/locale/sk/LC_MESSAGES/django.mo b/locale/sk/LC_MESSAGES/django.mo index d719a45..431c0be 100644 Binary files a/locale/sk/LC_MESSAGES/django.mo and b/locale/sk/LC_MESSAGES/django.mo differ diff --git a/locale/sk/LC_MESSAGES/django.po b/locale/sk/LC_MESSAGES/django.po index fd1020e..a0176fe 100644 --- a/locale/sk/LC_MESSAGES/django.po +++ b/locale/sk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-12 11:30-0300\n" +"POT-Creation-Date: 2025-08-14 22:07-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,6 +18,206 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " ">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +#: cluster/forms.py:17 dns/forms.py:111 templates/cluster/workers_list.html:8 +#: templates/dns/static_host_list.html:68 +#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 +#: wireguard_peer/forms.py:10 +msgid "Name" +msgstr "Názov" + +#: cluster/forms.py:18 templates/cluster/workers_list.html:24 +#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 +msgid "Enabled" +msgstr "Povolené" + +#: cluster/forms.py:19 +msgid "IP Lock" +msgstr "" + +#: cluster/forms.py:20 dns/forms.py:66 templates/cluster/workers_list.html:10 +#: templates/dns/static_host_list.html:18 +#: templates/firewall/manage_redirect_rule.html:43 +#: templates/firewall/manage_redirect_rule.html:67 +#: templates/firewall/manage_redirect_rule.html:68 +#: templates/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "IP adresa" + +#: cluster/forms.py:21 +msgid "Country" +msgstr "" + +#: cluster/forms.py:22 +msgid "City" +msgstr "" + +#: cluster/forms.py:23 dns/forms.py:65 templates/dns/static_host_list.html:17 +msgid "Hostname" +msgstr "Názov hostiteľa" + +#: cluster/forms.py:25 cluster/forms.py:95 dns/forms.py:25 dns/forms.py:67 +#: dns/forms.py:109 templates/firewall/manage_firewall_rule.html:380 +#: templates/firewall/manage_firewall_settings.html:60 +#: templates/firewall/manage_redirect_rule.html:85 +#: templates/wireguard/wireguard_manage_ip.html:42 +#: templates/wireguard/wireguard_manage_peer.html:170 +#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 +#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 +msgid "Back" +msgstr "Späť" + +#: cluster/forms.py:26 dns/forms.py:68 dns/forms.py:110 +#: templates/firewall/manage_firewall_rule.html:382 +#: templates/firewall/manage_redirect_rule.html:86 +#: templates/wireguard/wireguard_manage_ip.html:43 +#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 +#: user_manager/forms.py:181 +msgid "Delete" +msgstr "Vymazať" + +#: cluster/forms.py:54 cluster/forms.py:121 dns/forms.py:37 dns/forms.py:83 +#: dns/forms.py:134 templates/firewall/manage_firewall_rule.html:379 +#: templates/firewall/manage_firewall_settings.html:59 +#: templates/firewall/manage_redirect_rule.html:84 +#: templates/wireguard/wireguard_manage_ip.html:41 +#: templates/wireguard/wireguard_manage_peer.html:168 +#: templates/wireguard/wireguard_manage_server.html:130 +#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 +#: vpn_invite/forms.py:325 +msgid "Save" +msgstr "Uložiť" + +#: cluster/forms.py:69 +msgid "A worker with that name already exists." +msgstr "Worker s týmto názvom už existuje." + +#: cluster/forms.py:72 +msgid "IP Address is required when IP Lock is enabled." +msgstr "" + +#: cluster/forms.py:87 +msgid "Cluster Enabled" +msgstr "Cluster povolený" + +#: cluster/forms.py:88 +msgid "Primary Enable WireGuard" +msgstr "" + +#: cluster/forms.py:89 +msgid "Stats Sync Interval (seconds)" +msgstr "" + +#: cluster/forms.py:90 +msgid "Stats Cache Interval (seconds)" +msgstr "" + +#: cluster/forms.py:91 +msgid "Cluster Mode" +msgstr "" + +#: cluster/forms.py:92 +msgid "Restart Mode" +msgstr "Režim reštartu" + +#: cluster/forms.py:93 +msgid "Worker Display" +msgstr "" + +#: cluster/forms.py:134 +msgid "Stats sync interval must be at least 10 seconds." +msgstr "Interval synchronizácie štatistík musí byť aspoň 10 sekúnd." + +#: cluster/forms.py:137 +msgid "Stats cache interval must be at least 10 seconds." +msgstr "Interval cache štatistík musí byť aspoň 10 sekúnd." + +#: cluster/views.py:15 cluster/views.py:27 cluster/views.py:96 +#: templates/access_denied.html:9 +msgid "Access Denied" +msgstr "Prístup zamietnutý" + +#: cluster/views.py:17 templates/base.html:185 +msgid "Cluster" +msgstr "" + +#: cluster/views.py:33 +msgid "Edit Worker: " +msgstr "Upraviť Worker: " + +#: cluster/views.py:39 +msgid "Worker deleted|Worker deleted: " +msgstr "Worker vymazaný|Worker vymazaný: " + +#: cluster/views.py:42 +msgid "Worker not deleted|Invalid confirmation." +msgstr "Worker nebol vymazaný|Neplatné potvrdenie." + +#: cluster/views.py:46 templates/cluster/list_buttons.html:2 +msgid "Add Worker" +msgstr "Pridať Worker" + +#: cluster/views.py:57 +msgid "Worker updated|Worker updated: " +msgstr "Worker aktualizovaný|Worker aktualizovaný: " + +#: cluster/views.py:59 +msgid "Worker created|Worker created: " +msgstr "Worker vytvorený|Worker vytvorený: " + +#: cluster/views.py:64 +msgid "" +"\n" +"
Worker Configuration
\n" +"

Configure a cluster worker node that will synchronize with this " +"primary instance.

\n" +" \n" +"
Name
\n" +"

A unique name to identify this worker.

\n" +" \n" +"
IP Address
\n" +"

The IP address of the worker node. Leave empty if IP lock is " +"disabled.

\n" +" \n" +"
IP Lock
\n" +"

When enabled, the worker can only connect from the specified IP " +"address.

\n" +" \n" +"
Location Information
\n" +"

Optional location details for this worker (country, city, " +"hostname).

\n" +" " +msgstr "" + +#: cluster/views.py:99 templates/cluster/list_buttons.html:3 +msgid "Cluster Settings" +msgstr "Nastavenia Clustra" + +#: cluster/views.py:105 +msgid "Cluster settings updated successfully." +msgstr "Nastavenia clustra úspešne aktualizované." + +#: cluster/views.py:112 +msgid "" +"\n" +"
Cluster Mode
\n" +"

Configure how the cluster operates and synchronizes " +"configurations between nodes.

\n" +" \n" +"
Sync Intervals
\n" +"

Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.

\n" +" \n" +"
Restart Mode
\n" +"

Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"

\n" +" \n" +"
Worker Display
\n" +"

Select how workers should be identified in the interface - by " +"name, server address, location, or a combination.

\n" +" " +msgstr "" + #: console/views.py:25 console/views.py:57 user_manager/forms.py:16 msgid "Console" msgstr "Konzola" @@ -66,64 +266,14 @@ msgstr "Primárny DNS" msgid "Secondary DNS" msgstr "Sekundárny DNS" -#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 -#: templates/firewall/manage_firewall_rule.html:380 -#: templates/firewall/manage_firewall_settings.html:60 -#: templates/firewall/manage_redirect_rule.html:85 -#: templates/wireguard/wireguard_manage_ip.html:42 -#: templates/wireguard/wireguard_manage_peer.html:170 -#: templates/wireguard/wireguard_peer_list.html:166 user_manager/forms.py:49 -#: user_manager/forms.py:180 vpn_invite/forms.py:192 vpn_invite/forms.py:326 -msgid "Back" -msgstr "Späť" - #: dns/forms.py:29 msgid "Resolver Settings" msgstr "Nastavenia DNS" -#: dns/forms.py:37 dns/forms.py:83 dns/forms.py:134 -#: templates/firewall/manage_firewall_rule.html:379 -#: templates/firewall/manage_firewall_settings.html:59 -#: templates/firewall/manage_redirect_rule.html:84 -#: templates/wireguard/wireguard_manage_ip.html:41 -#: templates/wireguard/wireguard_manage_peer.html:168 -#: templates/wireguard/wireguard_manage_server.html:130 -#: user_manager/forms.py:98 user_manager/forms.py:205 vpn_invite/forms.py:191 -#: vpn_invite/forms.py:325 -msgid "Save" -msgstr "Uložiť" - -#: dns/forms.py:65 templates/dns/static_host_list.html:17 -msgid "Hostname" -msgstr "Názov hostiteľa" - -#: dns/forms.py:66 templates/dns/static_host_list.html:18 -#: templates/firewall/manage_redirect_rule.html:43 -#: templates/firewall/manage_redirect_rule.html:67 -#: templates/firewall/manage_redirect_rule.html:68 -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "IP adresa" - -#: dns/forms.py:68 dns/forms.py:110 -#: templates/firewall/manage_firewall_rule.html:382 -#: templates/firewall/manage_redirect_rule.html:86 -#: templates/wireguard/wireguard_manage_ip.html:43 -#: templates/wireguard/wireguard_peer_list.html:185 user_manager/forms.py:48 -#: user_manager/forms.py:181 -msgid "Delete" -msgstr "Vymazať" - #: dns/forms.py:75 msgid "Static DNS" msgstr "Statický DNS" -#: dns/forms.py:111 templates/dns/static_host_list.html:68 -#: templates/user_manager/peer_group_list.html:8 user_manager/forms.py:177 -#: wireguard_peer/forms.py:10 -msgid "Name" -msgstr "Názov" - #: dns/forms.py:112 firewall/forms.py:111 #: templates/dns/static_host_list.html:69 #: templates/firewall/manage_redirect_rule.html:18 @@ -470,10 +620,6 @@ msgstr "" "Ak nájdete problémy s prekladom alebo si želáte požiadať o nový jazyk, " "prosím otvorte" -#: templates/access_denied.html:9 -msgid "Access Denied" -msgstr "Prístup zamietnutý" - #: templates/access_denied.html:12 msgid "Sorry, you do not have permission to access this page." msgstr "Prepáčte, nemáte oprávnenie na prístup k tejto stránke." @@ -506,9 +652,10 @@ msgstr "Boli ste úspešne odhlásený." msgid "Login again" msgstr "Prihlásiť sa znovu" -#: templates/base.html:112 templates/dns/static_host_list.html:72 -#: vpn_invite/forms.py:78 vpn_invite/forms.py:79 vpn_invite/forms.py:80 -#: vpn_invite/forms.py:81 vpn_invite/forms.py:82 +#: templates/base.html:112 templates/cluster/workers_list.html:9 +#: templates/dns/static_host_list.html:72 vpn_invite/forms.py:78 +#: vpn_invite/forms.py:79 vpn_invite/forms.py:80 vpn_invite/forms.py:81 +#: vpn_invite/forms.py:82 msgid "Status" msgstr "Stav" @@ -521,11 +668,11 @@ msgstr "Správa používateľov" msgid "VPN Invite" msgstr "VPN pozvánka" -#: templates/base.html:254 +#: templates/base.html:263 msgid "Update Required" msgstr "Aktualizácia potrebná" -#: templates/base.html:256 +#: templates/base.html:265 msgid "" "Your WireGuard settings have been modified. To apply these changes, please " "update the configuration and reload the WireGuard service." @@ -533,22 +680,78 @@ msgstr "" "Vaše WireGuard nastavenia boli zmenené. Pre aplikovanie týchto zmien, prosím " "aktualizujte konfiguráciu a reštartujte WireGuard službu." -#: templates/base.html:265 +#: templates/base.html:274 msgid "Update and restart service" msgstr "Aktualizovať a reštartovať službu" -#: templates/base.html:273 +#: templates/base.html:282 msgid "Update and reload service" msgstr "Aktualizovať a znovu načítať službu" -#: templates/base.html:286 +#: templates/base.html:295 msgid "Update Available" msgstr "Aktualizácia dostupná" -#: templates/base.html:288 +#: templates/base.html:297 msgid "Version" msgstr "Verzia" +#: templates/cluster/workers_list.html:11 +msgid "Location" +msgstr "Umiestnenie" + +#: templates/cluster/workers_list.html:12 +msgid "Last Seen" +msgstr "Naposledy videný" + +#: templates/cluster/workers_list.html:13 +msgid "Config Version" +msgstr "Verzia konfigurácie" + +#: templates/cluster/workers_list.html:14 +msgid "Options" +msgstr "Možnosti" + +#: templates/cluster/workers_list.html:26 vpn_invite/forms.py:49 +msgid "Disabled" +msgstr "Zakázané" + +#: templates/cluster/workers_list.html:33 +msgid "IP Lock Enabled" +msgstr "IP zámok povolený" + +#: templates/cluster/workers_list.html:36 +#: templates/cluster/workers_list.html:43 +msgid "Not set" +msgstr "Nenastavené" + +#: templates/cluster/workers_list.html:50 +msgid "Never" +msgstr "" + +#: templates/cluster/workers_list.html:57 +msgid "Config Pending" +msgstr "Konfigurácia čaká" + +#: templates/cluster/workers_list.html:65 +msgid "Force Reload" +msgstr "" + +#: templates/cluster/workers_list.html:70 +msgid "Force Restart" +msgstr "" + +#: templates/cluster/workers_list.html:74 +#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 +#: templates/user_manager/peer_group_list.html:35 +#: templates/wireguard/wireguard_peer_list.html:196 +msgid "Edit" +msgstr "Upraviť" + +#: templates/cluster/workers_list.html:79 +msgid "No workers configured" +msgstr "" + #: templates/console/console.html:12 msgid "Clear" msgstr "Vymazať" @@ -589,12 +792,6 @@ msgstr "Posledná aktualizácia" msgid "Update" msgstr "Aktualizovať" -#: templates/dns/static_host_list.html:74 templates/user_manager/list.html:53 -#: templates/user_manager/peer_group_list.html:35 -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Upraviť" - #: templates/dns/static_host_list.html:116 msgid "Add Filter List" msgstr "Pridať filter zoznam" @@ -1584,14 +1781,6 @@ msgstr "" msgid "Please type the username to proceed." msgstr "Prosím zadajte používateľské meno na pokračovanie." -#: vpn_invite/forms.py:49 vpn_invite/forms.py:294 -msgid "Enabled" -msgstr "Povolené" - -#: vpn_invite/forms.py:49 -msgid "Disabled" -msgstr "Zakázané" - #: vpn_invite/forms.py:68 vpn_invite/forms.py:69 vpn_invite/forms.py:70 #: vpn_invite/forms.py:71 vpn_invite/forms.py:72 msgid "URL" diff --git a/templates/base.html b/templates/base.html index edfadf0..8ea2da9 100644 --- a/templates/base.html +++ b/templates/base.html @@ -178,6 +178,15 @@ + + diff --git a/templates/cluster/workers_list.html b/templates/cluster/workers_list.html new file mode 100644 index 0000000..f4ca92a --- /dev/null +++ b/templates/cluster/workers_list.html @@ -0,0 +1,86 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} + + + + + + + + + + + + + + + {% for worker in workers %} + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
{% trans 'Name' %}{% trans 'Status' %}{% trans 'IP Address' %}{% trans 'Location' %}{% trans 'Last Seen' %}{% trans 'Config Version' %}{% trans 'Options' %}
{{ worker.name }} + {% if worker.enabled %} + {% trans 'Enabled' %} + {% else %} + {% trans 'Disabled' %} + {% endif %} + + {% if worker.ip_address %} + {{ worker.ip_address }} + {% if worker.ip_lock %} + + {% endif %} + {% else %} + {% trans 'Not set' %} + {% endif %} + + {% if worker.country or worker.city %} + {% if worker.city %}{{ worker.city }}{% endif %}{% if worker.city and worker.country %}, {% endif %}{% if worker.country %}{{ worker.country }}{% endif %} + {% else %} + {% trans 'Not set' %} + {% endif %} + + {% if worker.workerstatus %} + {{ worker.workerstatus.last_seen|date:"M d, H:i" }} + {% else %} + {% trans 'Never' %} + {% endif %} + + {% if worker.workerstatus %} + {{ worker.workerstatus.config_version }} + {% if worker.workerstatus.config_pending %} + + {% endif %} + {% else %} + 0 + {% endif %} + + {% if worker.force_reload %} + + {% endif %} + + {% if worker.force_restart %} + + {% endif %} + + +
{% trans 'No workers configured' %}
+{% trans 'Add Worker' %} +{% trans 'Cluster Settings' %} +{% endblock %} \ No newline at end of file diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index 0969e06..80396d0 100644 --- a/wireguard_webadmin/urls.py +++ b/wireguard_webadmin/urls.py @@ -21,6 +21,7 @@ from accounts.views import view_create_first_user, view_login, view_logout from api.views import api_instance_info, api_peer_invite, api_peer_list, cron_check_updates, \ cron_update_peer_latest_handshake, peer_info, routerfleet_authenticate_session, routerfleet_get_user_token, \ wireguard_status +from cluster.views import cluster_main, cluster_settings, worker_manage from console.views import view_console from dns.views import view_apply_dns_config, view_manage_dns_settings, view_manage_filter_list, view_manage_static_host, \ view_static_host_list, view_toggle_dns_list, view_update_dns_list @@ -87,5 +88,8 @@ urlpatterns = [ path('vpn_invite/smtp_settings/', view_email_settings, name='email_settings'), path('invite/', view_public_vpn_invite, name='public_vpn_invite'), path('invite/download_config/', download_config_or_qrcode, name='download_config_or_qrcode'), + path('cluster/', cluster_main, name='cluster_main'), + path('cluster/worker/manage/', worker_manage, name='worker_manage'), + path('cluster/settings/', cluster_settings, name='cluster_settings'), path('change_language/', view_change_language, name='change_language'), ]