From 7c5cbe51be93941f15ef661c85faaaae67962444 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 14 Aug 2025 22:43:18 -0300 Subject: [PATCH] Add forms for Worker and ClusterSettings with translations and workers list template --- cluster/forms.py | 139 +++++++++++ cluster/views.py | 135 ++++++++++- locale/de/LC_MESSAGES/django.mo | Bin 49024 -> 50673 bytes locale/de/LC_MESSAGES/django.po | 350 ++++++++++++++++++++------- locale/es/LC_MESSAGES/django.mo | Bin 47140 -> 48656 bytes locale/es/LC_MESSAGES/django.po | 345 +++++++++++++++++++++------ locale/fr/LC_MESSAGES/django.mo | Bin 49400 -> 51088 bytes locale/fr/LC_MESSAGES/django.po | 353 +++++++++++++++++++++------- locale/pt_BR/LC_MESSAGES/django.mo | Bin 49276 -> 51625 bytes locale/pt_BR/LC_MESSAGES/django.po | 345 +++++++++++++++++++++------ locale/sk/LC_MESSAGES/django.mo | Bin 49098 -> 50563 bytes locale/sk/LC_MESSAGES/django.po | 345 +++++++++++++++++++++------ templates/base.html | 9 + templates/cluster/workers_list.html | 86 +++++++ wireguard_webadmin/urls.py | 4 + 15 files changed, 1717 insertions(+), 394 deletions(-) create mode 100644 cluster/forms.py create mode 100644 templates/cluster/workers_list.html 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 3608d263d6e16f34703a8a37c72d35b263fe4fa7..8fc6d66fa527aa6cfa32b32f639179c152bcaf07 100644 GIT binary patch delta 9737 zcmb8!cYKvazQ^%N0wkdY5=!WY5}H5~ni_fuf>aZlK+u!}IV7AwP6C3+QKWZ>h#)9M zKzfOSh{1w-SzJ-Dqk;ugc9#`&W!HW`-^_%Y{qxStAMg3i)22O70zUj_=#6Dz!Hdxq z))~tB5MvtR`&Er;9%{_;dTKQ$wwW;{E6MZ zJ@`r|?!&!u?lgv~S)63d0P>eGo;<9(F}GnSY-LQ)+()Gn4U4cEuEZ$Zw!{Odnfw4X6Q4Q%j^X6Lpsow;V@xDQW3U#LhE#MQ5jCF104{E@Fq6S(k znfcd)J;}Bq$vFVk;}p~b3Q-T7kLut$mmhPUMm^vY)Ta9ad6CRj)QsIkU0u_V-{8|01`qBiNH7>*lIyM8O`{`*i% zeH7KP;G0x5PeEqSJc48JO}qyi4>IOHoQ8w(UDRvY zkaf@lyP!68GHP#SAWIQ6bE#+~Mb2&5jr=fbjjmy3{28@&6}Wo>)2R?zi!FJbv z5H*!Axb~B%^Uk1d_yKCoub?*FFR0BHlWJ!q!Py^c(moco)KgNK|Eg40xC0we@8v#J zj}K!Q9!Kr|64Z^~M}0SLU|*~<($3H@Y)>9Qb!;oDqlZyT^b+d6Z#vHgsptV8Vl}*g z>d<$n8TkqI`u%|kSZkD>x@6Q6`A{8x9Ha3`Y=sBh@effm88+I!)=}7nyaVbv!7Nvq zj(5;77j=VU&P&d4-Z3pfJPyPzs2k74TDTN><;~NmwY`e*SZ%DG>K@pU{C@0=MVP2J z_B0i3u3u0iX>zaaNDJ&lo`&k_8r0f7h1!INP}hCr+J8e$arJR_iepim+Jow7JZeU} z;ceKzw4L>z<_^q3U9bSPW{;uP>S?TmyHIO-0PEvPtb?DRrt~`M!_{)Uy)FZFzbU9q zJ_}=UDeA4;jxl=wU!zhFKg6wg9W~Om6YK+@LCwH(sPoj(qPU8zi>q7iRKjr3X6R31c~cpMwz8>l_-73%!&unGQ%n$nnw z_PfvvHR3d6jg23*dAFeMe-5?OA5UccHL}lXsEvQa9;lxr^Pwls!&BHF2i(u+6PKYr zy?3SadmXtygI5cmz$6@%$!}4(8sqQ`dht58#nD+TBR-N9H0A*+2^_7+4R@nPc5ssY zIsYPR%09y|yn@~FDr#z5PPQ}E87q!t= zMs?s1)XYR?+aH&8oE@AzDLbmE)EakIGJ_a>&3sFn33bppzklUFfs2MqqRk*h~OGSI&0@lT!P$RCk%ziLB zqo#Z)>cYvW5zRq8U=wO44x(PG5~NS&HPjLeS#HlyL*3^g^x%37s^JAHRq;Hw!b_+T zgs)&nV-4Je!*MYF8CH!d=)Gzeb(ca;^QKj6f~LgBXP?QD4lbuq~dzNc_ef zzmAFICRk+GrX$uMPeF|^6O(Wj-h}W7lXlAQzOiZf?2L@T+T__7i*r%mk@cvKpTq?G7PU!ZpQh8A($-XTK}YP#mu)cCBwxD4 zZk|o3wcCn(7|kA3M-SmREJ2MpcB}mhM?2K!o$B&u(NBIA^}Mm$+|q1g{Pr3^npJY=+ZOGx->5K>JZ0eGxUFw^1|s zsq=D>iq_&9>W05#EsWS{d)^3j<2$egjz>MJcWAT*Qk!�pq>mz}{V z3?r|Hx=*kX72UWi>IUO61s}vtcowymq0ib5_CSqnAgbe|P$TnV1O`w`H3v12g{bqM z#0cE$+MmOoJm36rP%jKr@|Ykdu?;U8ET zs~)r?s*5^*AnN>)sDVsGofmNJb5YkX#$Xhc$Eh^Mo!9_Rqo(dM_Qf`b?Aqm`Hdi5P zb1lY(xCxu%an$vnyZmQ7P2T9R-E7~WuKyFOWAqW`U$0fuBX%us$C~7$Q72?$BF;pO zXg5Y-G1kCSsFA$y+P^|A!4DXX@x}I2+ZQzhgRm-&L=UDHGyj#S%%edMT!Jm|3DjmQ z!Itg@4}7b!(L(*@G5HNJ}a?% z>l@S_seRIZ2ZBwhjG`e9HDwQ?W@063B%4tq*^64+H&C1EOPAk7?VaeC?T4x}Y6iz( z9L_=AXB+DNhg|z9Y@_%8Diw_=<`w(tO-8Lz03+~W)S55By0`&7co@U+JZeN2Q0IMv zPvA|gjjLX@dus>key^iC@;27e`~QV&_z4$qAmTN<)+?RcP@l@9s0-gg&BRyO3;#g9 z|2@$BJ+Sp`zy-_K+D%)Z$$`eu=VIC>Q-73rpZed3SoeIYc53B=#3e%iz@ReQ zQu^ls{(P0t2D^tCPkc=LM5z3gDCD~5N;7_eab8AN)lA{oB-bWJ+wt>FCpkwvP23>* zb7B`_AkmrVL)*_pF7;6ugZe=Az!z``{)x+QAeNQNtC6q^~FT{gHRq8%s2JsK_hlqIUZ=(K* zM`fP#BX#i`8ded@h$Id?jQ0}DsZT(?^A)H^;xG&)3aLMUy@&+rDr+s~tW$hQd{QoN zSg!sb>Sr`X<;&MD`5!z%%qRX$+{1%ZmJs@ZayK!Sw$-kkZ;QE|`c_owNK_&J9{;5V z%3p|n#J#k?gH4Ij=j&tAf|yKKJ|J0h9J8RZTvao6jAV5@{- zsI8ig)DwtF?${`7!m(n)Lmbuk7r2A^Hy-_;>#H1CN%W@v5HXzkbX3X4Ryc^bQw@|y z2>q>TH@-&9BaRVer6!f0M76R8TuN+FuKC}oiYsln(HE|M7ak&3(zYF!6JHT=#30(v zqe?qs8&Qw8_Sl@LOoS7&2$g0WdyJ@WQ`3n0T}0{n52kSgQJ01`xSD8Ay{vR|l{nhk z5@U#IwEaeS%blmw?jz5|!FW6FAm&p~!Ma2vVh+)T_(RV>Nu_`je#Gv?eZ=F$!?dY< zPSkMqg?N*EDbCbE*WSn37#FC$T&YAois(eVMEKpg18|?lf04#49UxvNB8Z{xB&sHv zdWkBOHI~vp2k_@2Vim`S;jctrcU=zke$;Ebob*;nq%E_oUGqPOq%T&-UGB6X^~2O_ z5zi7?GvCdGN(`iI5m76uBu`JQBddPc4{%k*=3s<)uP=bs$7)ex`^MIDC5w&<7VpX8ft zES?cwe-@{frK7$10bicK_=TRoR;-%kD{xOs@@zlcKcec8yv&@khZXN1QY)-Ns@Ll; zIx&1jrOfmKU6(u}Dl}?XUV(=vn&H#b7AQ_l`8K@5(7Y^fapJfmA&~)3W_o6}*W)XC zIkjGFVgl!8=J~S%9ZYILdO^SwnB~v32dk7jSbTB(#;X18;60i7-t+=*)|~%NlRU;X zWO;MF<&L}59WR>bjcejgES#2A{zfiM@)Xa^_BO7Z?DLmR_pycDLMqvdimxnsH!PuS zuG4c0d^3FB{DQK{ZqHS$N^WkUf3nwqtF`E%l?{sa@2u8ku$_NPVSeendD065T$9aW znEyHunBf-W#Ih@uVqB*)yy^KFUSEONPe-3#+q`nk_Nmjn`T1VYtw?fa!+e?9_8=#@)$;m_FKu5RS$&w7t(Bf%(4KWG z3=|jcj|uJO3l#Wr+V|7qwIAeXz=7Tf0maK_yZo+EY+J+NbdJ!cnk8= znS~BTkM0;gNXu*Qk;)Qh=jZu-fzsgzeE~-m+6}HQYL<$aApuZ5_(C5K~#0p6d%}Y0IuD-^SFRDk%y1U)E{VrT_o{ delta 8509 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 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 c1e25e808677976286cea301b8f36d061cba41c6..0b4392c1c2cbad3c4a00256ce6ff2495682b4eaf 100644 GIT binary patch delta 9788 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
O4O8WLrvj6)D#|c{u9;nk5LW! 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 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 089bf98d638f29ffb1dd556b5685850b9696d3a9..bf597c7c8e655705c0eff0d00e6e0257e308c250 100644 GIT binary patch delta 9811 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 delta 8509 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\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 79df9ef0e4fa843336c6569825a106413a7c8fcb..68ebbec78b3ab19a369e6baf5d41e4f59a55542b 100644 GIT binary patch delta 10657 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 S3-|TDeqdXO_wFbAeEtWfHEwYL 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 d719a45c66de1cd176625bb862539c5a79859c54..431c0be212b7380b4cfe368a264b4c1bee90a468 100644 GIT binary patch delta 9765 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 delta 8513 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\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'), ]