Просмотр исходного кода

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>
Arthur Hanson 1 год назад
Родитель
Сommit
34d20fccd5

+ 4 - 4
netbox/account/views.py

@@ -109,7 +109,7 @@ class LoginView(View):
             # Authenticate user
             auth_login(request, form.get_user())
             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
             # create_userconfig() on user creation.)
@@ -159,7 +159,7 @@ class LogoutView(View):
         username = request.user
         auth_logout(request)
         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
         response = HttpResponseRedirect(resolve_url(settings.LOGOUT_REDIRECT_URL))
@@ -234,7 +234,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
     def get(self, request):
         # LDAP users cannot change their password here
         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')
 
         form = PasswordChangeForm(user=request.user)
@@ -249,7 +249,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
         if form.is_valid():
             form.save()
             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 render(request, self.template_name, {

+ 5 - 2
netbox/circuits/views.py

@@ -1,6 +1,7 @@
 from django.contrib import messages
 from django.db import transaction
 from django.shortcuts import get_object_or_404, redirect, render
+from django.utils.translation import gettext_lazy as _
 
 from dcim.views import PathTraceView
 from netbox.views import generic
@@ -326,7 +327,9 @@ class CircuitSwapTerminations(generic.ObjectEditView):
 
         # Circuit must have at least one termination to swap
         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 render(request, 'circuits/circuit_terminations_swap.html', {
@@ -374,7 +377,7 @@ class CircuitSwapTerminations(generic.ObjectEditView):
                 circuit.termination_z = None
                 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 render(request, 'circuits/circuit_terminations_swap.html', {

+ 15 - 12
netbox/core/views.py

@@ -76,7 +76,10 @@ class DataSourceSyncView(BaseObjectView):
         datasource = get_object_or_404(self.queryset, pk=pk)
         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())
 
 
@@ -235,7 +238,7 @@ class ConfigRevisionRestoreView(ContentTypePermissionRequiredMixin, View):
 
         candidate_config = get_object_or_404(ConfigRevision, pk=pk)
         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())
 
@@ -379,9 +382,9 @@ class BackgroundTaskDeleteView(BaseRQView):
             # Remove job id from queue and delete the actual job
             queue.connection.lrem(queue.key, 0, job.id)
             job.delete()
-            messages.success(request, f'Deleted job {job_id}')
+            messages.success(request, _('Job {id} has been deleted.').format(id=job_id))
         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'))
 
@@ -394,13 +397,13 @@ class BackgroundTaskRequeueView(BaseRQView):
         try:
             job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),)
         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 = get_queue_by_index(queue_index)
 
         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]))
 
 
@@ -412,7 +415,7 @@ class BackgroundTaskEnqueueView(BaseRQView):
         try:
             job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),)
         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 = get_queue_by_index(queue_index)
@@ -435,7 +438,7 @@ class BackgroundTaskEnqueueView(BaseRQView):
             registry = ScheduledJobRegistry(queue.name, queue.connection)
             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]))
 
 
@@ -452,11 +455,11 @@ class BackgroundTaskStopView(BaseRQView):
         queue_index = QUEUES_MAP[job.origin]
         queue = get_queue_by_index(queue_index)
 
-        stopped, _ = stop_jobs(queue, job_id)
-        if len(stopped) == 1:
-            messages.success(request, f'You have successfully stopped {job_id}')
+        stopped_jobs = stop_jobs(queue, job_id)[0]
+        if len(stopped_jobs) == 1:
+            messages.success(request, _('Job {id} has been stopped.').format(id=job_id))
         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]))
 

+ 24 - 6
netbox/dcim/views.py

@@ -2059,7 +2059,7 @@ class DeviceRenderConfigView(generic.ObjectView):
             try:
                 rendered_config = config_template.render(context=context_data)
             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()
 
         return {
@@ -2823,7 +2823,13 @@ class DeviceBayPopulateView(generic.ObjectEditView):
             device_bay.snapshot()
             device_bay.installed_device = form.cleaned_data['installed_device']
             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 redirect(return_url)
@@ -2858,7 +2864,13 @@ class DeviceBayDepopulateView(generic.ObjectEditView):
             removed_device = device_bay.installed_device
             device_bay.installed_device = None
             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 redirect(return_url)
@@ -3426,7 +3438,7 @@ class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMix
 
                 membership_form.save()
                 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:
@@ -3471,7 +3483,10 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL
         # Protect master device from being removed
         virtual_chassis = VirtualChassis.objects.filter(master=device).first()
         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())
 
         if form.is_valid():
@@ -3483,7 +3498,10 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL
                 device.vc_priority = None
                 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)
 
             return redirect(self.get_return_url(request, device))

+ 30 - 7
netbox/netbox/views/generic/bulk_views.py

@@ -106,7 +106,13 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
         try:
             return template.render_to_response(self.queryset)
         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
             query_params = request.GET.copy()
             query_params.pop('export')
@@ -668,7 +674,10 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView):
         # Retrieve objects being edited
         table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False)
         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 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):
                                 raise PermissionsViolation
 
-                            model_name = self.queryset.model._meta.verbose_name_plural
-                            messages.success(request, f"Renamed {len(selected_objects)} {model_name}")
+                            messages.success(
+                                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))
 
                 except (AbortRequest, PermissionsViolation) as e:
@@ -838,7 +852,10 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView):
                     messages.error(request, mark_safe(e.message))
                     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)
                 messages.success(request, msg)
                 return redirect(self.get_return_url(request))
@@ -855,7 +872,10 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView):
         # Retrieve objects being deleted
         table = self.table(self.queryset.filter(pk__in=pk_list), orderable=False)
         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 render(request, self.template_name, {
@@ -900,7 +920,10 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView):
 
         selected_objects = self.parent_model.objects.filter(pk__in=pk_list)
         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))
         table = self.table(selected_objects, orderable=False)
 

+ 9 - 4
netbox/netbox/views/generic/feature_views.py

@@ -202,11 +202,14 @@ class ObjectSyncDataView(View):
         obj = get_object_or_404(qs, **kwargs)
 
         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())
 
         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())
 
@@ -228,7 +231,9 @@ class BulkSyncDataView(GetReturnURLMixin, BaseMultiObjectView):
             for obj in selected_objects:
                 obj.sync(save=True)
 
-            model_name = self.queryset.model._meta.verbose_name_plural
-            messages.success(request, f"Synced {len(selected_objects)} {model_name}")
+            messages.success(request, _("Synced {count} {object_type}").format(
+                count=len(selected_objects),
+                object_type=self.queryset.model._meta.verbose_name_plural
+            ))
 
         return redirect(self.get_return_url(request))

+ 7 - 5
netbox/virtualization/views.py

@@ -271,8 +271,9 @@ class ClusterAddDevicesView(generic.ObjectEditView):
                     device.cluster = cluster
                     device.save()
 
-            messages.success(request, "Added {} devices to cluster {}".format(
-                len(device_pks), cluster
+            messages.success(request, _("Added {count} devices to cluster {cluster}").format(
+                count=len(device_pks),
+                cluster=cluster
             ))
             return redirect(cluster.get_absolute_url())
 
@@ -305,8 +306,9 @@ class ClusterRemoveDevicesView(generic.ObjectEditView):
                         device.cluster = None
                         device.save()
 
-                messages.success(request, "Removed {} devices from cluster {}".format(
-                    len(device_pks), cluster
+                messages.success(request, _("Removed {count} devices from cluster {cluster}").format(
+                    count=len(device_pks),
+                    cluster=cluster
                 ))
                 return redirect(cluster.get_absolute_url())
 
@@ -444,7 +446,7 @@ class VirtualMachineRenderConfigView(generic.ObjectView):
             try:
                 rendered_config = config_template.render(context=context_data)
             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()
 
         return {