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': _(''' +
Configure a cluster worker node that will synchronize with this primary instance.
+ +A unique name to identify this worker.
+ +The IP address of the worker node. Leave empty if IP lock is disabled.
+ +When enabled, the worker can only connect from the specified IP address.
+ +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': _(''' +Configure how the cluster operates and synchronizes configurations between nodes.
+ +Configure how frequently statistics and cache data are synchronized between cluster nodes.
+ +Choose whether WireGuard services should be automatically restarted when configurations change, or if manual intervention is required.
+ +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 NAMEConfigure a cluster worker node that will synchronize with this " +"primary instance.
\n" +" \n" +"A unique name to identify this worker.
\n" +" \n" +"The IP address of the worker node. Leave empty if IP lock is " +"disabled.
\n" +" \n" +"When enabled, the worker can only connect from the specified IP " +"address.
\n" +" \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" +"Configure how the cluster operates and synchronizes " +"configurations between nodes.
\n" +" \n" +"Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.
\n" +" \n" +"Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"
\n" +" \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 NAMEConfigure a cluster worker node that will synchronize with this " +"primary instance.
\n" +" \n" +"A unique name to identify this worker.
\n" +" \n" +"The IP address of the worker node. Leave empty if IP lock is " +"disabled.
\n" +" \n" +"When enabled, the worker can only connect from the specified IP " +"address.
\n" +" \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" +"Configure how the cluster operates and synchronizes " +"configurations between nodes.
\n" +" \n" +"Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.
\n" +" \n" +"Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"
\n" +" \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 NAMEConfigure a cluster worker node that will synchronize with this " +"primary instance.
\n" +" \n" +"A unique name to identify this worker.
\n" +" \n" +"The IP address of the worker node. Leave empty if IP lock is " +"disabled.
\n" +" \n" +"When enabled, the worker can only connect from the specified IP " +"address.
\n" +" \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" +"Configure how the cluster operates and synchronizes " +"configurations between nodes.
\n" +" \n" +"Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.
\n" +" \n" +"Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"
\n" +" \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 NAMEConfigure a cluster worker node that will synchronize with this " +"primary instance.
\n" +" \n" +"A unique name to identify this worker.
\n" +" \n" +"The IP address of the worker node. Leave empty if IP lock is " +"disabled.
\n" +" \n" +"When enabled, the worker can only connect from the specified IP " +"address.
\n" +" \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" +"Configure how the cluster operates and synchronizes " +"configurations between nodes.
\n" +" \n" +"Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.
\n" +" \n" +"Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"
\n" +" \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 NAMEConfigure a cluster worker node that will synchronize with this " +"primary instance.
\n" +" \n" +"A unique name to identify this worker.
\n" +" \n" +"The IP address of the worker node. Leave empty if IP lock is " +"disabled.
\n" +" \n" +"When enabled, the worker can only connect from the specified IP " +"address.
\n" +" \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" +"Configure how the cluster operates and synchronizes " +"configurations between nodes.
\n" +" \n" +"Configure how frequently statistics and cache data are " +"synchronized between cluster nodes.
\n" +" \n" +"Choose whether WireGuard services should be automatically " +"restarted when configurations change, or if manual intervention is required." +"
\n" +" \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 @@ ++ {% trans 'Cluster' %} +
+ +