From be7d00803fa931a2244f591cbdc9543ff41d15f5 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Tue, 15 Apr 2025 10:22:10 -0300 Subject: [PATCH] DNS app translation --- dns/forms.py | 41 ++++-- dns/views.py | 64 +++++---- locale/pt_BR/LC_MESSAGES/django.mo | Bin 7839 -> 11182 bytes locale/pt_BR/LC_MESSAGES/django.po | 205 +++++++++++++++++++++++++--- templates/dns/static_host_list.html | 31 +++-- 5 files changed, 259 insertions(+), 82 deletions(-) diff --git a/dns/forms.py b/dns/forms.py index 9d1de79..5cd5ea7 100644 --- a/dns/forms.py +++ b/dns/forms.py @@ -2,9 +2,10 @@ import re from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper -from crispy_forms.layout import Layout, Fieldset, Div, Field, Submit, HTML +from crispy_forms.layout import Div, Field, Fieldset, HTML, Layout, Submit from django import forms from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ from .models import DNSFilterList from .models import DNSSettings, StaticHost @@ -18,13 +19,14 @@ class DNSSettingsForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(DNSSettingsForm, self).__init__(*args, **kwargs) self.helper = FormHelper() - self.fields['dns_primary'].label = 'Primary Resolver' - self.fields['dns_secondary'].label = 'Secondary Resolver' + self.fields['dns_primary'].label = _('Primary Resolver') + self.fields['dns_secondary'].label = _('Secondary Resolver') self.fields['dns_primary'].required = True + back_label = _('Back') self.helper.form_method = 'post' self.helper.layout = Layout( Fieldset( - 'Resolver Settings', + _('Resolver Settings'), Div( Field('dns_primary', css_class='form-control'), Field('dns_secondary', css_class='form-control'), @@ -32,8 +34,8 @@ class DNSSettingsForm(forms.ModelForm): ), ), FormActions( - Submit('save', 'Save', css_class='btn btn-primary'), - HTML('Back'), + Submit('save', _('Save'), css_class='btn btn-primary'), + HTML(f'{back_label}'), ) ) @@ -60,13 +62,17 @@ class StaticHostForm(forms.ModelForm): super(StaticHostForm, self).__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_method = 'post' + self.fields['hostname'].label = _('Hostname') + self.fields['ip_address'].label = _('IP Address') + back_label = _('Back') + delete_label = _('Delete') if self.instance.pk: - delete_html = "Delete" + delete_html = f"{delete_label}" else: delete_html = '' self.helper.layout = Layout( Fieldset( - 'Static DNS', + _('Static DNS'), Div( Field('hostname', css_class='form-control'), Field('ip_address', css_class='form-control'), @@ -74,8 +80,8 @@ class StaticHostForm(forms.ModelForm): ), ), FormActions( - Submit('save', 'Save', css_class='btn btn-primary'), - HTML('Back '), + Submit('save', _('Save'), css_class='btn btn-primary'), + HTML(f'{back_label} '), HTML(delete_html), ) ) @@ -100,18 +106,23 @@ class DNSFilterListForm(forms.ModelForm): super(DNSFilterListForm, self).__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_method = 'post' - # Add a delete button if editing an existing instance + back_label = _('Back') + delete_label = _('Delete') + self.fields['name'].label = _('Name') + self.fields['description'].label = _('Description') + self.fields['list_url'].label = _('List URL') + if self.instance.pk: delete_html = ( "Delete" + f"data-command='delete' onclick='openCommandDialog(this)'>{delete_label}" ) self.fields['name'].widget.attrs['readonly'] = True else: delete_html = '' self.helper.layout = Layout( Fieldset( - 'DNS Filter List Details', + _('DNS Filter List Details'), Div( Div(Field('name', css_class='form-control'), css_class='col-md-12'), Div(Field('description', css_class='form-control'), css_class='col-md-12'), @@ -120,8 +131,8 @@ class DNSFilterListForm(forms.ModelForm): ), ), FormActions( - Submit('save', 'Save', css_class='btn btn-primary'), - HTML('Back'), + Submit('save', _('Save'), css_class='btn btn-primary'), + HTML(f'{back_label}'), HTML(delete_html), ) ) diff --git a/dns/views.py b/dns/views.py index 7a1f1d6..5a2cafa 100644 --- a/dns/views.py +++ b/dns/views.py @@ -5,12 +5,13 @@ import requests from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.shortcuts import render, get_object_or_404, redirect +from django.shortcuts import get_object_or_404, redirect, render from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from user_manager.models import UserAcl from .forms import DNSFilterListForm -from .forms import StaticHostForm, DNSSettingsForm +from .forms import DNSSettingsForm, StaticHostForm from .functions import generate_dnsmasq_config from .models import DNSFilterList, DNSSettings from .models import StaticHost @@ -29,13 +30,13 @@ def export_dns_configuration(): @login_required def view_apply_dns_config(request): export_dns_configuration() - messages.success(request, 'DNS settings applied successfully') + messages.success(request, _('DNS settings applied successfully')) return redirect('/dns/') @login_required def view_static_host_list(request): - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') static_host_list = StaticHost.objects.all().order_by('hostname') filter_lists = DNSFilterList.objects.all().order_by('-recommended', 'name') if not filter_lists: @@ -64,10 +65,10 @@ def view_static_host_list(request): ) filter_lists = DNSFilterList.objects.all().order_by('-recommended', 'name') - messages.success(request, 'Default DNS Filter List created successfully') + messages.success(request, _('Default DNS Filter List created successfully')) if dns_settings.pending_changes: - messages.warning(request, 'Pending Changes|There are pending DNS changes that have not been applied') + messages.warning(request, _('Pending Changes|There are pending DNS changes that have not been applied')) context = { 'dns_settings': dns_settings, 'static_host_list': static_host_list, @@ -80,19 +81,16 @@ def view_static_host_list(request): def view_manage_dns_settings(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=50).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') form = DNSSettingsForm(request.POST or None, instance=dns_settings) if form.is_valid(): form.save() return redirect('/dns/apply_config/') - form_description_content = ''' - DNS Forwarders -

- All DNS queries will be forwarded to the primary resolver. If the primary resolver is not available, the secondary resolver will be used. -

- - ''' + description_title = _('DNS Forwarders') + description_message = _('All DNS queries will be forwarded to the primary resolver. If the primary resolver is not available, the secondary resolver will be used.') + form_description_content = f'{description_title}

{description_message}

' + context = { 'dns_settings': dns_settings, @@ -109,7 +107,7 @@ def view_manage_dns_settings(request): def view_manage_static_host(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=40).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') if request.GET.get('uuid'): static_dns = get_object_or_404(StaticHost, uuid=request.GET.get('uuid')) if request.GET.get('action') == 'delete': @@ -117,10 +115,10 @@ def view_manage_static_host(request): static_dns.delete() dns_settings.pending_changes = True dns_settings.save() - messages.success(request, 'Static DNS deleted successfully') + messages.success(request, _('Static DNS deleted successfully')) return redirect('/dns/') else: - messages.warning(request, 'Static DNS not deleted|Invalid confirmation') + messages.warning(request, _('Static DNS not deleted|Invalid confirmation')) return redirect('/dns/') else: static_dns = None @@ -130,7 +128,7 @@ def view_manage_static_host(request): form.save() dns_settings.pending_changes = True dns_settings.save() - messages.success(request, 'Static DNS saved successfully') + messages.success(request, _('Static DNS saved successfully')) return redirect('/dns/') context = { @@ -146,27 +144,27 @@ def view_manage_filter_list(request): if not UserAcl.objects.filter(user=request.user, user_level__gte=40).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') if request.GET.get('uuid'): filter_list = get_object_or_404(DNSFilterList, uuid=request.GET.get('uuid')) if request.GET.get('action') == 'delete': if request.GET.get('confirmation') == 'delete': if filter_list.enabled: - messages.warning(request, 'DNS Filter List not deleted | Filter List is enabled') + messages.warning(request, _('DNS Filter List not deleted | Filter List is enabled')) return redirect('/dns/') file_path = os.path.join("/etc/dnsmasq/", f"{filter_list.uuid}.conf") if os.path.exists(file_path): try: os.remove(file_path) except Exception as e: - messages.error(request, f"Error removing config file: {e}") + messages.error(request, _("Error removing config file: ") + e) return redirect('/dns/') filter_list.delete() - messages.success(request, 'DNS Filter List deleted successfully') + messages.success(request, _('DNS Filter List deleted successfully')) return redirect('/dns/') else: - messages.warning(request, 'DNS Filter List not deleted | Invalid confirmation') + messages.warning(request, _('DNS Filter List not deleted | Invalid confirmation')) return redirect('/dns/') else: filter_list = None @@ -176,7 +174,7 @@ def view_manage_filter_list(request): form.save() dns_settings.pending_changes = True dns_settings.save() - messages.success(request, 'DNS Filter List saved successfully') + messages.success(request, _('DNS Filter List saved successfully')) return redirect('/dns/') context = { @@ -193,7 +191,7 @@ def view_update_dns_list(request): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) dns_list = get_object_or_404(DNSFilterList, uuid=request.GET.get('uuid')) - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') file_path = os.path.join("/etc/dnsmasq/", f"{dns_list.uuid}.conf") old_checksum = None @@ -203,7 +201,7 @@ def view_update_dns_list(request): old_content = f.read() old_checksum = hashlib.sha256(old_content).hexdigest() except Exception as e: - messages.error(request, f"Failed to read existing config file: {e}") + messages.error(request, _("Failed to read existing config file: ") + e) if dns_list.enabled: dns_list.enabled = False dns_list.save() @@ -221,7 +219,7 @@ def view_update_dns_list(request): dns_list.save() dns_settings.pending_changes = True dns_settings.save() - messages.error(request, f"Failed to fetch the host list: {e}") + messages.error(request, _("Failed to fetch the host list: ") + e) return redirect('/dns/') new_checksum = hashlib.sha256(content.encode('utf-8')).hexdigest() @@ -231,7 +229,7 @@ def view_update_dns_list(request): with open(file_path, "w") as f: f.write(content) except Exception as e: - messages.error(request, f"Failed to write config file: {e}") + messages.error(request, _("Failed to write config file: ") + e) if dns_list.enabled: dns_list.enabled = False dns_list.save() @@ -256,7 +254,7 @@ def view_update_dns_list(request): # Save changes to the DNSFilterList instance. dns_list.save() - messages.success(request, 'DNS Filter List updated successfully') + messages.success(request, _('DNS Filter List updated successfully')) return redirect('/dns/') @@ -265,7 +263,7 @@ def view_toggle_dns_list(request): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) dns_list = get_object_or_404(DNSFilterList, uuid=request.GET.get('uuid')) - dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings, dns_settings_created = DNSSettings.objects.get_or_create(name='dns_settings') file_path = os.path.join("/etc/dnsmasq/", f"{dns_list.uuid}.conf") if request.GET.get('action') == 'enable': @@ -273,12 +271,12 @@ def view_toggle_dns_list(request): dns_list.enabled = True dns_list.save() export_dns_configuration() - messages.success(request, 'DNS Filter List enabled successfully') + messages.success(request, _('DNS Filter List enabled successfully')) else: - messages.error(request, 'DNS Filter List not enabled | No valid hosts found') + messages.error(request, _('DNS Filter List not enabled | No valid hosts found')) else: dns_list.enabled = False dns_list.save() export_dns_configuration() - messages.success(request, 'DNS Filter List disabled successfully') + messages.success(request, _('DNS Filter List disabled successfully')) return redirect('/dns/') \ No newline at end of file diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index f3ad5a07b38661b8803c163a1f797476161cf758..7dbf161945217a250131db86105e3b9d4f604fd7 100644 GIT binary patch literal 11182 zcmchc>yISYS;i~)7H>jgOu&XX&T&F~!8^US<0Q_kckTAh?C#*Xd1iJOo5Z-L>-2Pa ztE<{o)ib-!BvC>TIFVwT$QBNYoOL7&7QrY{051Un9c=gmxCtrY0}2x2A_Pb{9}vIi zoT}=c*&bP0;_^E);qqJ*i|9nvpdGo^Jwg10SsLN$@>9e+$&S ze*~`p-}<&7;4gR=U)O+)fUjg3* z{tGBN-|{0t@MiETP;?p)kp$O+3<+)pHU1vZfDeHh|0z)OKMQKy(^dcTpw{`F>izG6 z;=`YUI>#&EJ>Wlp;_D4p2Ei0K4{F^Rygz5q%!p996u7eKZQM&M6?e+g>dzkw_n{3odWFN0}1*A?Ig!D~SAV-*x1 z9|Ug(KLLs_FM!(j&q2xmZ$S(GJ^0(;VT7*v{{?D&2^m!iE(bOKDp2#U1(_1;0}){` z1B%Wy@F&3(6ki?#wa(L^)_oQf{V#wz?;nD{4*nUaaS6)L(SjkUeI5g)FJA-?fPV#E z555B?{UW#@Y`-Z8{sjC0&lj<|=>0G#x{iR--xHwd3qjez$G|h-mq79Vu6KHR7QtJ1 zJ`Vmq_)DP9eK*RWaYw-S>piIc&sP0UR`_L5=YA2?dA|wDE?)ss2)+ht++To_(|1Ab|0<~cZ!n&(cY)&b61X4yD42lHfX{%J z!em4ed>ItKU*b!A`#VtQe>+TZd{VU$Vy{uC&_JORoso&zQS z-vTACm#gRRfQTx16*S;GZ}N2B3BH-<`#|yO0Z{sK61)ujW$-Nc1gLTM!gNe1SOaC( z15o<%8Sum4AA>sA_rS-&YjIX@0;Ov?t^SC{e)X^h>P-5G2Rg4lqW6c~FTV#z50FJ|Y zM{nYV?Da<4aH3DT)v2B(AAK-=$CEBNr4ByRH0kZn(&lM*(_~NUG*}&+qRFlXG)y8` zp?!p=&m}a}#KnOP@D|!fX(ws=9H%|(ei64pRMYuzTlKAi(#@ZvN!Ab1^hrH9J(o`E zBOS+YM>?#Je1Pm%y89qa zAKBquv?Dax&@8P@yO*~6a}OOM4YPK3r1x92pP?msxN)@?=GK(GxG;mTD7LaZGMjN| zLQ~j5n1`k1M`y^GPA^PTo7@z%I~`jTX2zzmjq0c6YI4wy=!+tAI8I8NoB6mX-Sde! zw?~E{%g?1n8KxZ@w3EclEUubIhBl9FVYXsA)~)Gg`4$6hWXcTEtQq8SKg>^?+!k4~ zY4etu>z?<8;TUOFns76WlW;w;d)+WjkfqV&3e8@_!bUAol5Mfy+;S1L2ZQ8v(B{Oa zv!N+;bp6;0(^B+wax12UCbe5;U~PU^&@N44!=f}<%8Mw1%)&$&Cvvn51~$x1oH|mr zHcZjWwoE7M_ro+Y*{~c8%e`i+7k7H5AD(7l6nC^m*$X)dOZ4EQcGBsFMVxNXYclwd zgoA+|=ax;D`|)BIhwa82LxdM+sp-av)l7DZSeDb?6LwAphY;t6HS>HA!wnl8O5(wK zCi%3N=N#e1a4^VnH{(!}6&k{~xo^cB$|9cJF2LZlS+l3g;E?CcGL!}q>x2fNEF}^t z&gqYAV%Y&UJEiIl6L`OSaugSmH=^Gd%fz*3$@1PJ4RV$pc|ISHs>1LS3k>_&W zcT7I-l$xMzvzQq_r9 zyH>E>aF~>4H{ZRgpEFnz3ubK5$>V`EESQbrGMMcnVE-*;9Q0%i>9D_!Hq55cAdAzo z;Fp|&8>>+#Q1JqTGmF*0Jg2vVo=L6abTcmPbTI3CrC#IiR@I%`F80ggm^RhR!eVv2vpPk+G;S)_j`f%_bLQqBr7j%=$$4zF?MWQunOvh5(&;%$ zKf`@+a+`NUUa|5i+0+F8uiGAb#&Zp~Fg?@)r)X1S-Bg5!7usjb&b}>ND#n{f`~J_? zH8WXyLn)8EVV(Pf*W!xvWs~PR4BtFy9XW&&htLYfon7edxk)kslMof){rEkyjW{6P z=SpZiYAZ({cFFH(99d?Tc~}HTSvw8;*8L~~+#-=k-Z-dZj#A_AQ+Q6$ zXw`3Z3bq@_V&wX37ugCLw>dArf6Un>oh95cNAc@LFFa`j1wV6aWj>hCHsaKOn{XrK z_oB$eFN}p>lUSI;&Oh*S%wX>`ws%aJc)NuX`XQpTQp1+k_cr9u*+fMRs_e!Mf_Y+! zAqyz8{PbQkP&~85yqE}NxUM-#HBGf za>ApP&uG;vS?6}b$_qOquLJc3#!UJzsej|D7>@x5%T-FUQl%up@^C$Yg|))fQF6t~ z3pp`6Qze_qH)E2YdZJmae6xC-X-Oq^j$OqE1glLFQ%|MKyY*mIDMe)jt644)Drbo@ z7swrx2R84=_$D#}q#ybmuFCs1Y%5qT@va@kfQg??tlSZw$3xxnRXp83Z(y7ld!7JS zy_MbiOi>-fA{c8aw^J<)`w*Y z1JIXjtHmzTl^-l$OX8C@X_7U+{_b?G7dll`b~cf$Ii9DsB-K9oeWh({y*wLk^hg&2 zyjWUviLA%clWDe9se4fQArGcqC&5)eY1>3zSa+`2M}{a|R6i>z&Armrs#>k*-xN+q zn^*iW3t>tI2{Al4_j`PK(Rc?NjDI#c;BkC~(uNc5mBqQmBiog=;{~dmSCVR+8&0UG z2(r;$r*OG96v=)j!|d!-r)N7SZmOd707vW*Qw7&ibn3}@Et)MSR^sr@X9yM(-!S;JB2HYAo34l2*x zuxaSRp5yn<%wF&MhtOS#eUB zS|~Q+XzHHfMlrRPO`AQ-OH(U$GnNWX%@A>?&Hc0Om8pfLshPGpx-`8ock=^Fi?e$a znWvngB#IT&=J2ukd9&DFm^F9KF0|+7?{3e`tjw;i9%QJ$1Wm2kus?0)+lxnziIO|# z=kHG97Rk?e3=}NPEzFL|zO{AB9xSUQ#!Ri99zc)MhJAyCFuz|s%i-~XV{3<}?ii1& z?00IG98!trw7FwFF83@a+}e_}qIcRRZY5$(!#zR@3 z3wjwRa99RGWJ!CWL37QpFNYW=ba4&L0A1yyOm}y(q0B7W4IYUfnnC{LySb;w9oQP? z<6q7#yD_@X<=Mm=B`l-o(hk)E0!<_2U@eQ#ZT?V-f_nwO6!%g5(N{8M%^@MY7iy5m zGRj5Vy*`3;UG+z2@;GY|7%%Y3q;4T{Mck_4b~wn=(N{NZvUleM6)w`qt>$(=!|j=4 zlin>CW?AvDjH669equzJ2gkF{=mn$)_bm6`M?+O6U{7Hm4!QTo+~VPEnr)I|;a|A; zXQpq{j9Yo1b46r3qvr{^qAuiUw!;kwxrC#yMvg~Z`Z0~nR7C)hs~rYhr*U|?_UEnx zLq%%ZLy{dix;2k&2qs0gE(b-bhDH1Fcsjf|bg@ulilgT%Hn9MQAh2?8ebh1Fc!pSz zvPv}UITyuH7PQ^fpCw?KbuuT-a&cz#f)lel+2}X9y~sZzK~j7x4XT-1tW*ci> zvHc9KoryPeU(D*-#n3F))9`&&8N*cuOqg+Fl2tGoV;t8o^v1i9s@oSD)LpZ3V$S#_ zjwH;v6Nq%KH5#8om7E_B7qa}SwxQ7$A{;prVPrkb0^`vms4UMlZ zmMk^w?GV5Z$*zJgTdA zpr}=xxIoS0|7SDAjaMfLvIQ=C^t|&)xve;;XgA4*!?-nS=#szle3Y@}`^F+&9~N@< zp{s$QqbQc?|zbbZh zT$@|w-Z47UwHugpNP=I7|6s-miOH2-Hvw8a8^`Au1#vMz`9eL^afoM^3WOI5J;ZDu zqefp$O8yyO+Eq03hV6SHp782RFJrRn*y3{^^xGvnoSr~V5e5!YCs8rRIm^j&?MQ2k zQZ;7~VKcN5xvK^Gm)rF^qoNcee)SZtJwshE_jRf!$-&?}t11Ri zV}(qhpwhTJto;0riCx)WQETGCj^`M(5(1OX5MEXidiKJIlKYvmE!BC*X5{d3XibGj z`5>B6NYN2F#<%G*v=AkiCwIH>GBe~PO2KfBt~^ukKph|^!Q7FZL8`C+Q~~h<6V4M9 zOdUcU|Hoe6tx$$=(#JQW+K|gSCyZx#bXN5t(x1`SqZkXiZ-s(S?bkWByB8{bl(slg z@t(AJSouev4y`mE=e#pk6}s~=CDe@S40w0Er4k*l$BhqAm>ebp{$b{M?1ZOOxT+gT zGris^)spW}UN#t=p|BaY0wwsfN>!;L5iBR4nq18bxX#sfj&a-7NnN&m=mMF~&PhsC zb}rgvi;ejgW3upN&`jRbn3?KC{su!xnz+J9BYkip4`~^HFK}5p|4{HZBo_hYLGb(a zBCgit5`3yw>scwDh3jE_N{$~LM&oN=>dyPd?g;pYP3nJ%b5-o7Yl1EVx;ac-6eO!1 z_XCY_Lc&-y@&~&qtc9msc-narXbMpNV&H=oX*PVL5<`;5|3v+519v;=sm)B|$dcww zKCVo8cfNDVBKN4GkU?=psh2gD9Oyjevui{hpU2iRwu9UpD~8Ta3rbi1m)<&u>vWys z)x;eo6PY_-s&;{tgEsYuYkxV`{TTSLv$4G#pbz-5UuMxf(w;lNvbcJ zioa9pBS-A6foM~A$UTe;x@3#Dlz_2MblTmPz2)lPQVKi`d0A2o1h^a delta 2075 zcmYk-TWl0n9LMpqZ4oTc?akIgk)hodEYvEMwn*2uz-lW+3Jo?2FJpIXH}(>Dwx!;( zsqsP}D#@S$3E{yA_yCOzf?{G~qDbPkiHQ#&@}S0uMiUZEG$ww3vt!be{m*CiboR{o z|IeA}>49VM?A6kO*9@(ns3y+l8S@18&f`EUo^MPumf&JcU=;hY0tay+K836CMV!Gi zSb&c%$X!2#8h;OJ=!3|3S@Q-bH_>qtZ^jwafbWO>pP&Z%9QDIlyam5SUH=>2hJS_q z6?AH1Yw%XwgqrYfEXNTn!s)=QF$Xx=K*up0z{^OtX)etDz(-B!67n(Ma45#_aT)%B z78Y?4b1+S)zqg?#+=G0~HV&%5F5HMy7}JeD;G_|+p#~^gWDFlu$w33eum>Bk7Bkp{ zhftNdgv#g(r0V7hD)S$(3jalhHkH)71#3|ie?;|nII%f7jh~`2oMbdjWE$x*`%oDj zLY44sR7pQX-QY`Hfpw*F=3}2=fuHz*%HY<_6x0dEDeZY(`b!*D~rKTtG*& zE+9Sqp#{|+5A8)|whNWfFe(!lb^X(*rFssv#(R-DnzyhH&!H-H1+_W=#sDkBF~2^U9j1`lI3qiBuKp(gqjYJyjhkGamF0rMEN4I5DteGDm@8ATp?+`}2k>KT!D{Z(j{T?%51=x8J^X$GZN8sEl{iY8UD%01MNkRuMOE$yF301@ zW1BS>IZ>uR;=OnSHPf~1C>Ph`c|3*6%vqYt_!(3t`;niRqsSc0`SAPKs6FrtTDXXM zQ+3mb+H)JRSP%LZPWYJJ98{7g@d8exE^Ox^XAF}-wu!NE15V(2d!_*nCTjM_#^>C>YtV6BJ8eR( qvGGZJ)EUe8J8CN;-i6p@?_^!4_fOq2Z*%=tzjdV>@z1XMJMTZ;2j\n" "Language-Team: LANGUAGE \n" @@ -18,6 +18,148 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: dns/forms.py:22 +msgid "Primary Resolver" +msgstr "Servidor Primário" + +#: dns/forms.py:23 +msgid "Secondary Resolver" +msgstr "Servidor Secundário" + +#: dns/forms.py:25 dns/forms.py:67 dns/forms.py:109 +#: templates/wireguard/wireguard_peer_list.html:166 +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 +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/wireguard/wireguard_status.html:45 +msgid "IP Address" +msgstr "Endereço IP" + +#: dns/forms.py:68 dns/forms.py:110 +#: templates/wireguard/wireguard_peer_list.html:185 +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 +msgid "Name" +msgstr "Nome" + +#: dns/forms.py:112 templates/dns/static_host_list.html:69 +msgid "Description" +msgstr "Descrição" + +#: dns/forms.py:113 +msgid "List URL" +msgstr "Endereço da Lista" + +#: dns/forms.py:125 +msgid "DNS Filter List Details" +msgstr "Detalhes da Lista de Filtro de DNS" + +#: dns/views.py:33 +msgid "DNS settings applied successfully" +msgstr "Configurações de DNS aplicadas com sucesso" + +#: dns/views.py:68 +msgid "Default DNS Filter List created successfully" +msgstr "Lista de Filtro de DNS padrão criada com sucesso" + +#: dns/views.py:71 +msgid "" +"Pending Changes|There are pending DNS changes that have not been applied" +msgstr "" +"Alterações Pendentes|Há alterações de DNS pendentes que não foram aplicadas" + +#: dns/views.py:90 +msgid "DNS Forwarders" +msgstr "Servidores DNS" + +#: dns/views.py:91 +msgid "" +"All DNS queries will be forwarded to the primary resolver. If the primary " +"resolver is not available, the secondary resolver will be used." +msgstr "" +"Todas as consultas DNS serão encaminhadas para o resolvedor primário. Se o " +"resolvedor primário não estiver disponível, o resolvedor secundário será " +"usado." + +#: dns/views.py:118 +msgid "Static DNS deleted successfully" +msgstr "DNS Estático excluído com sucesso" + +#: dns/views.py:121 +msgid "Static DNS not deleted|Invalid confirmation" +msgstr "DNS Estático não excluído|Confirmação inválida" + +#: dns/views.py:131 +msgid "Static DNS saved successfully" +msgstr "DNS Estático salvo com sucesso" + +#: dns/views.py:154 +msgid "DNS Filter List not deleted | Filter List is enabled" +msgstr "Lista de Filtro de DNS não excluída | Lista de Filtro está habilitada" + +#: dns/views.py:161 +msgid "Error removing config file: " +msgstr "Erro ao remover o arquivo de configuração: " + +#: dns/views.py:164 +msgid "DNS Filter List deleted successfully" +msgstr "Lista de Filtro de DNS excluída com sucesso" + +#: dns/views.py:167 +msgid "DNS Filter List not deleted | Invalid confirmation" +msgstr "Lista de Filtro de DNS não excluída | Confirmação inválida" + +#: dns/views.py:177 +msgid "DNS Filter List saved successfully" +msgstr "Lista de Filtro de DNS salva com sucesso" + +#: dns/views.py:204 +msgid "Failed to read existing config file: " +msgstr "Erro ao ler o arquivo de configuração existente: " + +#: dns/views.py:222 +msgid "Failed to fetch the host list: " +msgstr "Erro ao buscar a lista de hosts: " + +#: dns/views.py:232 +msgid "Failed to write config file: " +msgstr "Falha ao escrever o arquivo de configuração: " + +#: dns/views.py:257 +msgid "DNS Filter List updated successfully" +msgstr "Lista de Filtro de DNS atualizada com sucesso" + +#: dns/views.py:274 +msgid "DNS Filter List enabled successfully" +msgstr "Lista de Filtro de DNS habilitada com sucesso" + +#: dns/views.py:276 +msgid "DNS Filter List not enabled | No valid hosts found" +msgstr "Lista de Filtro de DNS não habilitada | Nenhum host válido encontrado" + +#: dns/views.py:281 +msgid "DNS Filter List disabled successfully" +msgstr "Lista de Filtro de DNS desabilitada com sucesso" + #: intl_tools/forms.py:11 templates/accounts/login.html:36 msgid "Language" msgstr "Idioma" @@ -61,7 +203,7 @@ msgstr "Você foi desconectado com sucesso." msgid "Login again" msgstr "Acessar novamente" -#: templates/base.html:112 +#: templates/base.html:112 templates/dns/static_host_list.html:72 msgid "Status" msgstr "Estado" @@ -101,6 +243,47 @@ msgstr "Atualização Disponível" msgid "Version" msgstr "Versão" +#: templates/dns/static_host_list.html:9 +msgid "Static Host List" +msgstr "Lista de Endereços Estáticos" + +#: templates/dns/static_host_list.html:45 +msgid "Add" +msgstr "Adicionar" + +#: templates/dns/static_host_list.html:46 +msgid "Settings" +msgstr "Configurações" + +#: templates/dns/static_host_list.html:47 +msgid "Apply" +msgstr "Aplicar" + +#: templates/dns/static_host_list.html:59 +msgid "DNS Filter Lists" +msgstr "Listas de Filtro de DNS" + +#: templates/dns/static_host_list.html:70 +msgid "Hosts" +msgstr "Endereços" + +#: templates/dns/static_host_list.html:71 +msgid "Last Update" +msgstr "Última Atualização" + +#: templates/dns/static_host_list.html:73 +msgid "Update" +msgstr "Atualizar" + +#: templates/dns/static_host_list.html:74 +#: 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" + #: templates/wireguard/wireguard_peer_list.html:75 #: templates/wireguard/wireguard_peer_list.html:125 msgid "Throughput" @@ -152,10 +335,6 @@ msgstr "Sem histórico de tráfego, por favor aguarde alguns minutos" msgid "Close QR Code" msgstr "Fechar QR Code" -#: templates/wireguard/wireguard_peer_list.html:166 -msgid "Back" -msgstr "Voltar" - #: templates/wireguard/wireguard_peer_list.html:168 msgid "VPN Invite Details" msgstr "Detalhes do Convite para VPN" @@ -180,10 +359,6 @@ msgstr "Email" msgid "WhatsApp" msgstr "WhatsApp" -#: templates/wireguard/wireguard_peer_list.html:185 -msgid "Delete" -msgstr "Excluir" - #: templates/wireguard/wireguard_peer_list.html:192 msgid "Close" msgstr "Fechar" @@ -196,10 +371,6 @@ msgstr "Configuração" msgid "QR Code" msgstr "Código QR" -#: templates/wireguard/wireguard_peer_list.html:196 -msgid "Edit" -msgstr "Editar" - #: templates/wireguard/wireguard_peer_list.html:204 msgid "No WireGuard Instances Found" msgstr "Nenhuma Instância do WireGuard Encontrada" @@ -316,10 +487,6 @@ msgstr "Recarregar o serviço Wireguard" msgid "Instance Traffic" msgstr "Tráfego da Instância" -#: templates/wireguard/wireguard_status.html:45 -msgid "IP Address" -msgstr "Endereço IP" - #: templates/wireguard/wireguard_status.html:46 msgid "Public Address" msgstr "Endereço Público" @@ -336,7 +503,7 @@ msgstr "Peers" msgid "WireGuard Status" msgstr "Estado do WireGuard" -#: wireguard_peer/views.py:49 +#: wireguard_peer/views.py:50 msgid "WireGuard Peer List" msgstr "Lista de Peers do WireGuard" diff --git a/templates/dns/static_host_list.html b/templates/dns/static_host_list.html index 3f0c643..7efcc41 100644 --- a/templates/dns/static_host_list.html +++ b/templates/dns/static_host_list.html @@ -1,11 +1,12 @@ {% extends 'base.html' %} +{% load i18n %} {% block content %}
-

Static Host List

+

{% trans 'Static Host List' %}

@@ -13,8 +14,8 @@ - - + + @@ -41,9 +42,9 @@ @@ -55,7 +56,7 @@
-

DNS Filter Lists

+

{% trans 'DNS Filter Lists' %}

@@ -64,13 +65,13 @@
- - - - - - - + + + + + + + @@ -111,7 +112,7 @@
HostnameIP Address{% trans 'Hostname' %}{% trans 'IP Address' %}
NameDescriptionHostsLast UpdateStatusUpdateEdit{% trans 'Name' %}{% trans 'Description' %}{% trans 'Hosts' %}{% trans 'Last Update' %}{% trans 'Status' %}{% trans 'Update' %}{% trans 'Edit' %}