17036 international messages (#17041)

* 17036 international messages

* 17036 fix typo

* 17036 fix _

* Misc cleanup & fixes

* More cleanup

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson 2024-08-10 22:47:06 +07:00 committed by GitHub
parent f6c1642116
commit 34d20fccd5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 94 additions and 40 deletions

View File

@ -109,7 +109,7 @@ class LoginView(View):
# Authenticate user # Authenticate user
auth_login(request, form.get_user()) auth_login(request, form.get_user())
logger.info(f"User {request.user} successfully authenticated") logger.info(f"User {request.user} successfully authenticated")
messages.success(request, f"Logged in as {request.user}.") messages.success(request, _("Logged in as {user}.").format(user=request.user))
# Ensure the user has a UserConfig defined. (This should normally be handled by # Ensure the user has a UserConfig defined. (This should normally be handled by
# create_userconfig() on user creation.) # create_userconfig() on user creation.)
@ -159,7 +159,7 @@ class LogoutView(View):
username = request.user username = request.user
auth_logout(request) auth_logout(request)
logger.info(f"User {username} has logged out") logger.info(f"User {username} has logged out")
messages.info(request, "You have logged out.") messages.info(request, _("You have logged out."))
# Delete session key & language cookies (if set) upon logout # Delete session key & language cookies (if set) upon logout
response = HttpResponseRedirect(resolve_url(settings.LOGOUT_REDIRECT_URL)) response = HttpResponseRedirect(resolve_url(settings.LOGOUT_REDIRECT_URL))
@ -234,7 +234,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
def get(self, request): def get(self, request):
# LDAP users cannot change their password here # LDAP users cannot change their password here
if getattr(request.user, 'ldap_username', None): if getattr(request.user, 'ldap_username', None):
messages.warning(request, "LDAP-authenticated user credentials cannot be changed within NetBox.") messages.warning(request, _("LDAP-authenticated user credentials cannot be changed within NetBox."))
return redirect('account:profile') return redirect('account:profile')
form = PasswordChangeForm(user=request.user) form = PasswordChangeForm(user=request.user)
@ -249,7 +249,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
if form.is_valid(): if form.is_valid():
form.save() form.save()
update_session_auth_hash(request, form.user) update_session_auth_hash(request, form.user)
messages.success(request, "Your password has been changed successfully.") messages.success(request, _("Your password has been changed successfully."))
return redirect('account:profile') return redirect('account:profile')
return render(request, self.template_name, { return render(request, self.template_name, {

View File

@ -1,6 +1,7 @@
from django.contrib import messages from django.contrib import messages
from django.db import transaction from django.db import transaction
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _
from dcim.views import PathTraceView from dcim.views import PathTraceView
from netbox.views import generic from netbox.views import generic
@ -326,7 +327,9 @@ class CircuitSwapTerminations(generic.ObjectEditView):
# Circuit must have at least one termination to swap # Circuit must have at least one termination to swap
if not circuit.termination_a and not circuit.termination_z: if not circuit.termination_a and not circuit.termination_z:
messages.error(request, "No terminations have been defined for circuit {}.".format(circuit)) messages.error(request, _(
"No terminations have been defined for circuit {circuit}."
).format(circuit=circuit))
return redirect('circuits:circuit', pk=circuit.pk) return redirect('circuits:circuit', pk=circuit.pk)
return render(request, 'circuits/circuit_terminations_swap.html', { return render(request, 'circuits/circuit_terminations_swap.html', {
@ -374,7 +377,7 @@ class CircuitSwapTerminations(generic.ObjectEditView):
circuit.termination_z = None circuit.termination_z = None
circuit.save() circuit.save()
messages.success(request, f"Swapped terminations for circuit {circuit}.") messages.success(request, _("Swapped terminations for circuit {circuit}.").format(circuit=circuit))
return redirect('circuits:circuit', pk=circuit.pk) return redirect('circuits:circuit', pk=circuit.pk)
return render(request, 'circuits/circuit_terminations_swap.html', { return render(request, 'circuits/circuit_terminations_swap.html', {

View File

@ -76,7 +76,10 @@ class DataSourceSyncView(BaseObjectView):
datasource = get_object_or_404(self.queryset, pk=pk) datasource = get_object_or_404(self.queryset, pk=pk)
job = datasource.enqueue_sync_job(request) job = datasource.enqueue_sync_job(request)
messages.success(request, f"Queued job #{job.pk} to sync {datasource}") messages.success(
request,
_("Queued job #{id} to sync {datasource}").format(id=job.pk, datasource=datasource)
)
return redirect(datasource.get_absolute_url()) return redirect(datasource.get_absolute_url())
@ -235,7 +238,7 @@ class ConfigRevisionRestoreView(ContentTypePermissionRequiredMixin, View):
candidate_config = get_object_or_404(ConfigRevision, pk=pk) candidate_config = get_object_or_404(ConfigRevision, pk=pk)
candidate_config.activate() candidate_config.activate()
messages.success(request, f"Restored configuration revision #{pk}") messages.success(request, _("Restored configuration revision #{id}").format(id=pk))
return redirect(candidate_config.get_absolute_url()) return redirect(candidate_config.get_absolute_url())
@ -379,9 +382,9 @@ class BackgroundTaskDeleteView(BaseRQView):
# Remove job id from queue and delete the actual job # Remove job id from queue and delete the actual job
queue.connection.lrem(queue.key, 0, job.id) queue.connection.lrem(queue.key, 0, job.id)
job.delete() job.delete()
messages.success(request, f'Deleted job {job_id}') messages.success(request, _('Job {id} has been deleted.').format(id=job_id))
else: else:
messages.error(request, f'Error deleting job: {form.errors[0]}') messages.error(request, _('Error deleting job {id}: {error}').format(id=job_id, error=form.errors[0]))
return redirect(reverse('core:background_queue_list')) return redirect(reverse('core:background_queue_list'))
@ -394,13 +397,13 @@ class BackgroundTaskRequeueView(BaseRQView):
try: try:
job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),)
except NoSuchJobError: except NoSuchJobError:
raise Http404(_("Job {job_id} not found").format(job_id=job_id)) raise Http404(_("Job {id} not found.").format(id=job_id))
queue_index = QUEUES_MAP[job.origin] queue_index = QUEUES_MAP[job.origin]
queue = get_queue_by_index(queue_index) queue = get_queue_by_index(queue_index)
requeue_job(job_id, connection=queue.connection, serializer=queue.serializer) requeue_job(job_id, connection=queue.connection, serializer=queue.serializer)
messages.success(request, f'You have successfully requeued: {job_id}') messages.success(request, _('Job {id} has been re-enqueued.').format(id=job_id))
return redirect(reverse('core:background_task', args=[job_id])) return redirect(reverse('core:background_task', args=[job_id]))
@ -412,7 +415,7 @@ class BackgroundTaskEnqueueView(BaseRQView):
try: try:
job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),)
except NoSuchJobError: except NoSuchJobError:
raise Http404(_("Job {job_id} not found").format(job_id=job_id)) raise Http404(_("Job {id} not found.").format(id=job_id))
queue_index = QUEUES_MAP[job.origin] queue_index = QUEUES_MAP[job.origin]
queue = get_queue_by_index(queue_index) queue = get_queue_by_index(queue_index)
@ -435,7 +438,7 @@ class BackgroundTaskEnqueueView(BaseRQView):
registry = ScheduledJobRegistry(queue.name, queue.connection) registry = ScheduledJobRegistry(queue.name, queue.connection)
registry.remove(job) registry.remove(job)
messages.success(request, f'You have successfully enqueued: {job_id}') messages.success(request, _('Job {id} has been enqueued.').format(id=job_id))
return redirect(reverse('core:background_task', args=[job_id])) return redirect(reverse('core:background_task', args=[job_id]))
@ -452,11 +455,11 @@ class BackgroundTaskStopView(BaseRQView):
queue_index = QUEUES_MAP[job.origin] queue_index = QUEUES_MAP[job.origin]
queue = get_queue_by_index(queue_index) queue = get_queue_by_index(queue_index)
stopped, _ = stop_jobs(queue, job_id) stopped_jobs = stop_jobs(queue, job_id)[0]
if len(stopped) == 1: if len(stopped_jobs) == 1:
messages.success(request, f'You have successfully stopped {job_id}') messages.success(request, _('Job {id} has been stopped.').format(id=job_id))
else: else:
messages.error(request, f'Failed to stop {job_id}') messages.error(request, _('Failed to stop job {id}').format(id=job_id))
return redirect(reverse('core:background_task', args=[job_id])) return redirect(reverse('core:background_task', args=[job_id]))

View File

@ -2059,7 +2059,7 @@ class DeviceRenderConfigView(generic.ObjectView):
try: try:
rendered_config = config_template.render(context=context_data) rendered_config = config_template.render(context=context_data)
except TemplateError as e: except TemplateError as e:
messages.error(request, f"An error occurred while rendering the template: {e}") messages.error(request, _("An error occurred while rendering the template: {error}").format(error=e))
rendered_config = traceback.format_exc() rendered_config = traceback.format_exc()
return { return {
@ -2823,7 +2823,13 @@ class DeviceBayPopulateView(generic.ObjectEditView):
device_bay.snapshot() device_bay.snapshot()
device_bay.installed_device = form.cleaned_data['installed_device'] device_bay.installed_device = form.cleaned_data['installed_device']
device_bay.save() device_bay.save()
messages.success(request, "Added {} to {}.".format(device_bay.installed_device, device_bay)) messages.success(
request,
_("Installed device {device} in bay {device_bay}.").format(
device=device_bay.installed_device,
device_bay=device_bay
)
)
return_url = self.get_return_url(request) return_url = self.get_return_url(request)
return redirect(return_url) return redirect(return_url)
@ -2858,7 +2864,13 @@ class DeviceBayDepopulateView(generic.ObjectEditView):
removed_device = device_bay.installed_device removed_device = device_bay.installed_device
device_bay.installed_device = None device_bay.installed_device = None
device_bay.save() device_bay.save()
messages.success(request, f"{removed_device} has been removed from {device_bay}.") messages.success(
request,
_("Removed device {device} from bay {device_bay}.").format(
device=removed_device,
device_bay=device_bay
)
)
return_url = self.get_return_url(request, device_bay.device) return_url = self.get_return_url(request, device_bay.device)
return redirect(return_url) return redirect(return_url)
@ -3426,7 +3438,7 @@ class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMix
membership_form.save() membership_form.save()
messages.success(request, mark_safe( messages.success(request, mark_safe(
f'Added member <a href="{device.get_absolute_url()}">{escape(device)}</a>' _('Added member <a href="{url}">{escape(device)}</a>').format(url=device.get_absolute_url())
)) ))
if '_addanother' in request.POST: if '_addanother' in request.POST:
@ -3471,7 +3483,10 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL
# Protect master device from being removed # Protect master device from being removed
virtual_chassis = VirtualChassis.objects.filter(master=device).first() virtual_chassis = VirtualChassis.objects.filter(master=device).first()
if virtual_chassis is not None: if virtual_chassis is not None:
messages.error(request, f'Unable to remove master device {device} from the virtual chassis.') messages.error(
request,
_('Unable to remove master device {device} from the virtual chassis.').format(device=device)
)
return redirect(device.get_absolute_url()) return redirect(device.get_absolute_url())
if form.is_valid(): if form.is_valid():
@ -3483,7 +3498,10 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL
device.vc_priority = None device.vc_priority = None
device.save() device.save()
msg = 'Removed {} from virtual chassis {}'.format(device, device.virtual_chassis) msg = _('Removed {device} from virtual chassis {chassis}').format(
device=device,
chassis=device.virtual_chassis
)
messages.success(request, msg) messages.success(request, msg)
return redirect(self.get_return_url(request, device)) return redirect(self.get_return_url(request, device))

View File

@ -106,7 +106,13 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
try: try:
return template.render_to_response(self.queryset) return template.render_to_response(self.queryset)
except Exception as e: except Exception as e:
messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}") messages.error(
request,
_("There was an error rendering the selected export template ({template}): {error}").format(
template=template.name,
error=e
)
)
# Strip the `export` param and redirect user to the filtered objects list # Strip the `export` param and redirect user to the filtered objects list
query_params = request.GET.copy() query_params = request.GET.copy()
query_params.pop('export') query_params.pop('export')
@ -668,7 +674,10 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView):
# Retrieve objects being edited # Retrieve objects being edited
table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False)
if not table.rows: if not table.rows:
messages.warning(request, "No {} were selected.".format(model._meta.verbose_name_plural)) messages.warning(
request,
_("No {object_type} were selected.").format(object_type=model._meta.verbose_name_plural)
)
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
return render(request, self.template_name, { return render(request, self.template_name, {
@ -745,8 +754,13 @@ class BulkRenameView(GetReturnURLMixin, BaseMultiObjectView):
if self.queryset.filter(pk__in=renamed_pks).count() != len(selected_objects): if self.queryset.filter(pk__in=renamed_pks).count() != len(selected_objects):
raise PermissionsViolation raise PermissionsViolation
model_name = self.queryset.model._meta.verbose_name_plural messages.success(
messages.success(request, f"Renamed {len(selected_objects)} {model_name}") request,
_("Renamed {count} {object_type}").format(
count=len(selected_objects),
object_type=self.queryset.model._meta.verbose_name_plural
)
)
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
except (AbortRequest, PermissionsViolation) as e: except (AbortRequest, PermissionsViolation) as e:
@ -838,7 +852,10 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView):
messages.error(request, mark_safe(e.message)) messages.error(request, mark_safe(e.message))
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
msg = f"Deleted {deleted_count} {model._meta.verbose_name_plural}" msg = _("Deleted {count} {object_type}").format(
count=deleted_count,
object_type=model._meta.verbose_name_plural
)
logger.info(msg) logger.info(msg)
messages.success(request, msg) messages.success(request, msg)
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
@ -855,7 +872,10 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView):
# Retrieve objects being deleted # Retrieve objects being deleted
table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False) table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False)
if not table.rows: if not table.rows:
messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural)) messages.warning(
request,
_("No {object_type} were selected.").format(object_type=model._meta.verbose_name_plural)
)
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
return render(request, self.template_name, { return render(request, self.template_name, {
@ -900,7 +920,10 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView):
selected_objects = self.parent_model.objects.filter(pk__in=pk_list) selected_objects = self.parent_model.objects.filter(pk__in=pk_list)
if not selected_objects: if not selected_objects:
messages.warning(request, "No {} were selected.".format(self.parent_model._meta.verbose_name_plural)) messages.warning(
request,
_("No {object_type} were selected.").format(object_type=self.parent_model._meta.verbose_name_plural)
)
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))
table = self.table(selected_objects, orderable=False) table = self.table(selected_objects, orderable=False)

View File

@ -202,11 +202,14 @@ class ObjectSyncDataView(View):
obj = get_object_or_404(qs, **kwargs) obj = get_object_or_404(qs, **kwargs)
if not obj.data_file: if not obj.data_file:
messages.error(request, f"Unable to synchronize data: No data file set.") messages.error(request, _("Unable to synchronize data: No data file set."))
return redirect(obj.get_absolute_url()) return redirect(obj.get_absolute_url())
obj.sync(save=True) obj.sync(save=True)
messages.success(request, f"Synchronized data for {model._meta.verbose_name} {obj}.") messages.success(request, _("Synchronized data for {object_type} {object}.").format(
object_type=model._meta.verbose_name,
object=obj
))
return redirect(obj.get_absolute_url()) return redirect(obj.get_absolute_url())
@ -228,7 +231,9 @@ class BulkSyncDataView(GetReturnURLMixin, BaseMultiObjectView):
for obj in selected_objects: for obj in selected_objects:
obj.sync(save=True) obj.sync(save=True)
model_name = self.queryset.model._meta.verbose_name_plural messages.success(request, _("Synced {count} {object_type}").format(
messages.success(request, f"Synced {len(selected_objects)} {model_name}") count=len(selected_objects),
object_type=self.queryset.model._meta.verbose_name_plural
))
return redirect(self.get_return_url(request)) return redirect(self.get_return_url(request))

View File

@ -271,8 +271,9 @@ class ClusterAddDevicesView(generic.ObjectEditView):
device.cluster = cluster device.cluster = cluster
device.save() device.save()
messages.success(request, "Added {} devices to cluster {}".format( messages.success(request, _("Added {count} devices to cluster {cluster}").format(
len(device_pks), cluster count=len(device_pks),
cluster=cluster
)) ))
return redirect(cluster.get_absolute_url()) return redirect(cluster.get_absolute_url())
@ -305,8 +306,9 @@ class ClusterRemoveDevicesView(generic.ObjectEditView):
device.cluster = None device.cluster = None
device.save() device.save()
messages.success(request, "Removed {} devices from cluster {}".format( messages.success(request, _("Removed {count} devices from cluster {cluster}").format(
len(device_pks), cluster count=len(device_pks),
cluster=cluster
)) ))
return redirect(cluster.get_absolute_url()) return redirect(cluster.get_absolute_url())
@ -444,7 +446,7 @@ class VirtualMachineRenderConfigView(generic.ObjectView):
try: try:
rendered_config = config_template.render(context=context_data) rendered_config = config_template.render(context=context_data)
except TemplateError as e: except TemplateError as e:
messages.error(request, f"An error occurred while rendering the template: {e}") messages.error(request, _("An error occurred while rendering the template: {error}").format(error=e))
rendered_config = traceback.format_exc() rendered_config = traceback.format_exc()
return { return {